来自另一个协程的龙卷风协程逐渐增加

时间:2018-06-12 09:51:56

标签: tornado coroutine

我想重构我的Tornado应用程序的一部分,因此我创建了一个返回电话号码的特殊功能:

@gen.coroutine
def get_phones(self, listname):
    phones = []
    logging.info("fetching phones")
    cursor = self._mongo.contacts.aggregate(self.get_query(
        subscription_filter={
            "$ne": [{"$ifNull": ["$$subscription.events.{listname}", None]}, None]
        },
        handler_filter={
            "handler.meta.is_active": True,
            "handler.meta.type": "phone"
        }
    ))
    try:
        while (yield cursor.fetch_next):
            contact = cursor.next_object()
            logging.info(contact)
            try:
                phones += [handler['subject'] for handler in contact['handlers']]
                if len(phones) > 50:
                    yield phones
                    phones = []
            except Exception:
                self._logger.warning("Could not get phone no")
    except Exception:
        phones = []
        logging.warning("Could not fetch contacts")

    if len(phones) > 0:
        yield phones

我想用它来实现的是异步从我的数据库中获取最多50个联系人的批次并将它们返回到调用协同程序。

这是我的呼唤协程:

@gen.coroutine
def on_heartbeat_status_update(self, status):
    phonegen = self.get_phones("ews:admin")
    logging.info(phonegen)
    while True:
        phones = yield phonegen
        logging.info(phones)
        if phones is None:
            break
        logging.info(len(phones))

它无法正常工作。 "电话"总是没有。有人可以建议正确的方法来实现这一目标吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您必须使用Python 3.6本机协同程序才能工作。这是在同一函数中支持<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/text_view1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:padding="8dp" android:textSize="18sp" app:layout_constraintHorizontal_bias="0" app:layout_constraintBottom_toTopOf="@id/text_view2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="Text1" /> <TextView android:id="@+id/text_view2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:padding="8dp" android:textSize="18sp" app:layout_constraintHorizontal_bias="0" app:layout_constraintBottom_toTopOf="@id/text_view3" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_view1" tools:text="Text2" /> <TextView android:id="@+id/text_view3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" android:padding="8dp" android:textSize="18sp" app:layout_constraintHorizontal_bias="0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_view2" tools:text="Text3" /> <android.support.constraint.Barrier android:id="@+id/barrier" android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="end" app:constraint_referenced_ids="text_view1,text_view2,text_view3" /> <ImageView android:id="@+id/image_view" android:layout_width="48dp" android:layout_height="48dp" app:layout_constraintHorizontal_bias="0" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/barrier" app:layout_constraintTop_toTopOf="parent" tools:background="@android:color/black" /> </android.support.constraint.ConstraintLayout> yield的第一个Python版本。如果没有这个,系统就不可能区分使用await作为协程并将结果作为生成器。

yield替换为@gen.coroutine def,并使用async def中的await cursor.fetch_nextyield phones。然后,您可以在get_phones中使用async for phones in self.get_phones(...)