আসল তথ্য:
পাইথন থেকে শুরু করে asyncio.create_task(coro)উচ্চ-স্তরের ফাংশন এই উদ্দেশ্যে যুক্ত করা হয়েছিল ।
আপনার এটির পরিবর্তে কর্যুর সময় থেকে কাজগুলি তৈরি করার অন্যান্য উপায়গুলি ব্যবহার করা উচিত। তবে আপনার যদি স্বেচ্ছাসেবী থেকে প্রত্যাশিত থেকে কোনও কাজ তৈরি করতে হয় তবে আপনার ব্যবহার করা উচিত asyncio.ensure_future(obj)।
পুরানো তথ্য:
ensure_future বনাম create_task
ensure_futureTaskথেকে তৈরি একটি পদ্ধতি coroutine। এটি আর্গুমেন্টের উপর ভিত্তি করে বিভিন্ন ধরণের টাস্ক তৈরি করে ( create_taskকর্টাইন এবং ভবিষ্যতের মতো সামগ্রীর জন্য ব্যবহার সহ )।
create_taskএর একটি বিমূর্ত পদ্ধতি AbstractEventLoop। বিভিন্ন ইভেন্টের লুপগুলি এই কার্যটি বিভিন্ন উপায়ে বাস্তবায়ন করতে পারে।
ensure_futureকাজগুলি তৈরি করতে আপনার ব্যবহার করা উচিত । আপনি create_taskকেবল নিজের ইভেন্ট লুপের প্রকারটি প্রয়োগ করতে গেলে আপনার প্রয়োজন হবে ।
আপডেট:
@ bj0 দিকে তাক গাইডো এর উত্তর এই বিষয়ে:
মূল ensure_future()বক্তব্যটি হ'ল যদি আপনার কাছে এমন কিছু থাকে যা হয় হয় কর্টিন বা একটি হতে পারে Future(এর মধ্যে একটি Taskকারণ এটি একটি সাবক্লাস রয়েছে Future), এবং আপনি এটিতে কোনও পদ্ধতিতে কল করতে সক্ষম হতে চান যা কেবলমাত্র সংজ্ঞায়িত হয়েছে Future(সম্ভবত কেবলমাত্র সম্পর্কে দরকারী উদাহরণ cancel())। যখন এটি ইতিমধ্যে একটি Future(বা Task) হয় তখন তা কিছুই করে না; যখন এটি একটি coroutine এটা গোপন করে একটি এটা Task।
আপনি যদি জানেন যে আপনার কোনও কর্টিন রয়েছে এবং আপনি এটি নির্ধারিত করতে চান, তবে সঠিক API ব্যবহার করা উচিত create_task()। কেবলমাত্র যখন আপনি কল ensure_future()করা উচিত তখন যখন আপনি একটি এপিআই সরবরাহ করেন (অ্যাসিনসিওর বেশিরভাগ নিজস্ব নিজস্ব এপিআইয়ের মতো) যা কোনও কর্টিন বা একটি গ্রহণ করে Futureএবং আপনাকে এটির জন্য কিছু করতে হবে যা আপনার প্রয়োজন Future।
এবং পরে:
পরিশেষে আমি এখনও বিশ্বাস করি এটি ensure_future()খুব কম প্রয়োজনীয় কার্যকারিতার টুকরোটির জন্য একটি যথাযথ অস্পষ্ট নাম। কোনও কর্টিন থেকে কোনও কাজ তৈরি করার সময় আপনার যথাযথ-নাম ব্যবহার করা উচিত
loop.create_task()। এর জন্য কি কোনও নাম থাকতে হবে
asyncio.create_task()?
এটা আমার জন্য অবাক। ensure_futureলুপের সদস্যের সাথে তুলনা করে উচ্চতর স্তরের ফাংশনটি create_task(আলোচনায় যুক্তকরণ বা যুক্ত করার মতো কিছু ধারণাগুলি রয়েছে ) এর সাথে সমস্ত ব্যবহার করার আমার মূল প্রেরণা ছিল ।asyncio.spawnasyncio.create_task
আমি এটিও উল্লেখ করতে পারি যে আমার মতে এটি সর্বজনীন ফাংশনটি ব্যবহার করা বেশ সুবিধাজনক যা Awaitableকেবল কার্টাইনগুলির চেয়ে কোনও হ্যান্ডেল করতে পারে ।
তবে, গিডোর উত্তর পরিষ্কার: "কোনও কর্টিন থেকে কোনও কাজ তৈরি করার সময় আপনার যথাযথ-নাম ব্যবহার করা উচিত loop.create_task()"
কর্টাইনগুলি কখন কার্যগুলিতে আবৃত করা উচিত?
কোনও টাস্কে কর্টিন মোড়ান - "ব্যাকগ্রাউন্ডে" এই কর্টিনটি শুরু করার একটি উপায়। এখানে উদাহরণ:
import asyncio
async def msg(text):
await asyncio.sleep(0.1)
print(text)
async def long_operation():
print('long_operation started')
await asyncio.sleep(3)
print('long_operation finished')
async def main():
await msg('first')
task = asyncio.ensure_future(long_operation())
await msg('second')
await task
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
আউটপুট:
first
long_operation started
second
long_operation finished
আপনি প্রতিস্থাপন করতে পারেন asyncio.ensure_future(long_operation())শুধু সঙ্গে await long_operation()পার্থক্য অনুভব করতে।
create_taskযদি সত্যই এএ টাস্ক অবজেক্টের প্রয়োজন হয় তবে আপনার ব্যবহার করা উচিত , যা আপনার সাধারণত প্রয়োজন হয় না: github.com/python/asyncio/issues/477#issuecomment-268709555