Asyncio.gather বনাম asyncio.wait


150

asyncio.gatherএবং এর asyncio.waitঅনুরূপ ব্যবহার রয়েছে বলে মনে হচ্ছে: আমার কাছে অনেকগুলি সংশ্লেষযুক্ত জিনিস রয়েছে যা আমি কার্যকর করতে / অপেক্ষা করতে চাই (অগত্যা পরবর্তীটি শুরু হওয়ার আগে কোনওটি শেষ হওয়ার অপেক্ষায় নেই)। এগুলি একটি পৃথক বাক্য গঠন ব্যবহার করে এবং কিছু বিবরণে পৃথক হয় তবে 2 টি ক্রিয়াকলাপের কার্যকারিতাটিতে এত বড় ওভারল্যাপ থাকা আমার কাছে খুব অ-পাইথোনিক বলে মনে হয়। আমি কী মিস করছি?

উত্তর:


178

সাধারণ ক্ষেত্রে একই রকম হলেও ("অনেকগুলি কাজের জন্য চালান এবং ফলাফল পান"), প্রতিটি কার্যক্রমে অন্যান্য ক্ষেত্রে কিছু নির্দিষ্ট কার্যকারিতা থাকে:

asyncio.gather()

কর্মের উচ্চ স্তরের দলবদ্ধকরণের মঞ্জুরি দিয়ে একটি ভবিষ্যতের উদাহরণ ফেরৎ:

import asyncio
from pprint import pprint

import random


async def coro(tag):
    print(">", tag)
    await asyncio.sleep(random.uniform(1, 3))
    print("<", tag)
    return tag


loop = asyncio.get_event_loop()

group1 = asyncio.gather(*[coro("group 1.{}".format(i)) for i in range(1, 6)])
group2 = asyncio.gather(*[coro("group 2.{}".format(i)) for i in range(1, 4)])
group3 = asyncio.gather(*[coro("group 3.{}".format(i)) for i in range(1, 10)])

all_groups = asyncio.gather(group1, group2, group3)

results = loop.run_until_complete(all_groups)

loop.close()

pprint(results)

একটি গোষ্ঠীর সমস্ত কাজ কল করে group2.cancel()বা এমনকি বাতিল করে দেওয়া যেতে পারে all_groups.cancel()। আরও দেখুন .gather(..., return_exceptions=True),

asyncio.wait()

প্রথম টাস্কটি শেষ হওয়ার পরে বা নির্দিষ্ট সময়সীমা পেরিয়ে অপারেশনগুলির নিম্ন স্তরের যথাযথতা অনুমোদনের জন্য অপেক্ষা করা সমর্থন করে:

import asyncio
import random


async def coro(tag):
    print(">", tag)
    await asyncio.sleep(random.uniform(0.5, 5))
    print("<", tag)
    return tag


loop = asyncio.get_event_loop()

tasks = [coro(i) for i in range(1, 11)]

print("Get first result:")
finished, unfinished = loop.run_until_complete(
    asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED))

for task in finished:
    print(task.result())
print("unfinished:", len(unfinished))

print("Get more results in 2 seconds:")
finished2, unfinished2 = loop.run_until_complete(
    asyncio.wait(unfinished, timeout=2))

for task in finished2:
    print(task.result())
print("unfinished2:", len(unfinished2))

print("Get all other results:")
finished3, unfinished3 = loop.run_until_complete(asyncio.wait(unfinished2))

for task in finished3:
    print(task.result())

loop.close()

5
"একক তারকাচিহ্ন ফর্ম (* আরগস) একটি অ-কী-ওয়ার্ডযুক্ত, পরিবর্তনশীল-দৈর্ঘ্যের আর্গুমেন্ট তালিকাটি পাস করার জন্য ব্যবহৃত হয় এবং ডাবল অ্যাসিড্রিক ফর্মটি একটি কী-ওয়ার্ডযুক্ত, ভেরিয়েবল-দৈর্ঘ্যের আর্গুমেন্ট তালিকাটি পাস করার জন্য ব্যবহৃত হয়"
লেটকাট

41

asyncio.waitতুলনায় আরও নিম্ন স্তরের asyncio.gather

নামটি যেমন বোঝায়, asyncio.gatherমূলত ফলাফল সংগ্রহের দিকে মনোনিবেশ করে। এটি ফিউচারগুলির একগুচ্ছের জন্য অপেক্ষা করে এবং তাদের ফলাফল প্রদত্ত ক্রমে ফিরিয়ে দেয়।

asyncio.waitশুধু ভবিষ্যতের জন্য অপেক্ষা এবং আপনাকে সরাসরি ফলাফল দেওয়ার পরিবর্তে এটি সম্পন্ন এবং মুলতুবি থাকা কাজগুলি দেয়। আপনাকে ম্যানুয়ালি মানগুলি সংগ্রহ করতে হবে।

তদুপরি, আপনি সমস্ত ফিউচার সমাপ্ত হওয়ার জন্য অপেক্ষা করতে বা কেবল প্রথমটির সাথে নির্দিষ্ট করতে পারেন wait


তুমি বলো: it waits on a bunch of futures and return their results in a given order । আমার যদি 1000000000000000 কাজ থাকে এবং সেগুলি সমস্ত বড় ডেটা ফেরত দেয়? সব রেজাল্ট কি স্মৃতিশূন্যতা বাড়িয়ে তুলবে?
কিংডাম

@ কিংসনাম ..ওয়াত
ম্যাট

14

আমি আরও লক্ষ্য করেছি যে আপনি কেবলমাত্র তালিকাটি নির্দিষ্ট করে অপেক্ষা করতে () অপেক্ষা কর্টিনগুলির একটি গ্রুপ সরবরাহ করতে পারেন:

result=loop.run_until_complete(asyncio.wait([
        say('first hello', 2),
        say('second hello', 1),
        say('third hello', 4)
    ]))

যেখানে জমায়েতে গ্রুপিং () কেবলমাত্র একাধিক কর্টাইন নির্দিষ্ট করেই করা হয়:

result=loop.run_until_complete(asyncio.gather(
        say('first hello', 2),
        say('second hello', 1),
        say('third hello', 4)
    ))

20
তালিকাগুলিও এর সাথে ব্যবহার করা যেতে পারে gather(), যেমন:asyncio.gather(*task_list)
15

1
সুতরাং জেনারেটরগুলি করতে পারেন
জব

স্ক্রিপ্টের বাকী অংশটি অবরুদ্ধ না করে আপনি কীভাবে এই জমায়েত ব্যবহার করতে পারেন?
বিবিয়েন কাউন্টারে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.