我想重构我的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))
它无法正常工作。 "电话"总是没有。有人可以建议正确的方法来实现这一目标吗?谢谢!
答案 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_next
和yield phones
。然后,您可以在get_phones
中使用async for phones in self.get_phones(...)
。