Upd:
প্রতিস্থাপন asyncio.ensure_future
সঙ্গে asyncio.create_task
আপনি পাইথন> = 3.7 এটা নতুন আছে, সুন্দর পথ ব্যবহার করছেন সর্বত্র যদি ডিম কাজের জন্য ।
asyncio.Task "আগুন এবং ভুলে যাও"
পাইথন ডক্স অনুসারে "ব্যাকগ্রাউন্ডে" চালানোর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