युपीडी:
बदलें asyncio.ensure_future
के साथ asyncio.create_task
आप अजगर> = 3.7 यह नए है, अच्छे तरह से उपयोग कर रहे हैं हर जगह है, तो अंडे कार्य करने के लिए ।
asyncio.Task to "आग और भूल"
अजगर डॉक्स के अनुसार "पृष्ठभूमि में"asyncio.Task
को निष्पादित करने के लिए कुछ कॉरआउट शुरू करना संभव है । asyncio.ensure_future
फ़ंक्शन द्वारा बनाया गया कार्य निष्पादन को अवरुद्ध नहीं करेगा (इसलिए फ़ंक्शन तुरंत वापस आ जाएगा!)। यह आपके अनुरोध के अनुसार "आग और भूलने" का एक तरीका है।
import asyncio
async def async_foo():
print("async_foo started")
await asyncio.sleep(1)
print("async_foo done")
async def main():
asyncio.ensure_future(async_foo()) # fire and forget async_foo()
# btw, you can also create tasks inside non-async funcs
print('Do some actions 1')
await asyncio.sleep(1)
print('Do some actions 2')
await asyncio.sleep(1)
print('Do some actions 3')
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
आउटपुट:
Do some actions 1
async_foo started
Do some actions 2
async_foo done
Do some actions 3
क्या होगा अगर इवेंट लूप पूरा होने के बाद कार्य निष्पादित हो रहे हैं?
ध्यान दें कि asyncio को उम्मीद है कि टास्क पूरा होने पर कार्य पूरा हो जाएगा। तो अगर आप बदलेंगे main()
:
async def main():
asyncio.ensure_future(async_foo()) # fire and forget
print('Do some actions 1')
await asyncio.sleep(0.1)
print('Do some actions 2')
कार्यक्रम समाप्त होने के बाद आपको यह चेतावनी मिलेगी:
Task was destroyed but it is pending!
task: <Task pending coro=<async_foo() running at [...]
यह रोकने के लिए कि आप इवेंट लूप पूरा होने के बाद सभी लंबित कार्यों का इंतजार कर सकते हैं :
async def main():
asyncio.ensure_future(async_foo()) # fire and forget
print('Do some actions 1')
await asyncio.sleep(0.1)
print('Do some actions 2')
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
# Let's also finish all running tasks:
pending = asyncio.Task.all_tasks()
loop.run_until_complete(asyncio.gather(*pending))
उन्हें इंतजार करने के बजाय कार्यों को मार डालो
कभी-कभी आप किए जाने वाले कार्यों का इंतजार नहीं करना चाहते हैं (उदाहरण के लिए, कुछ कार्यों को हमेशा के लिए चलाने के लिए बनाया जा सकता है)। उस स्थिति में, आप उन्हें प्रतीक्षा करने के बजाय बस रद्द कर सकते हैं:
import asyncio
from contextlib import suppress
async def echo_forever():
while True:
print("echo")
await asyncio.sleep(1)
async def main():
asyncio.ensure_future(echo_forever()) # fire and forget
print('Do some actions 1')
await asyncio.sleep(1)
print('Do some actions 2')
await asyncio.sleep(1)
print('Do some actions 3')
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
# Let's also cancel all running tasks:
pending = asyncio.Task.all_tasks()
for task in pending:
task.cancel()
# Now we should await task to execute it's cancellation.
# Cancelled task raises asyncio.CancelledError that we can suppress:
with suppress(asyncio.CancelledError):
loop.run_until_complete(task)
आउटपुट:
Do some actions 1
echo
Do some actions 2
echo
Do some actions 3
echo