Asyncio.ensure_future қарсы BaseEventLoop.create_task қарапайым корутинмен салыстырғанда?

Мен бірдей операцияны әртүрлі тәсілдермен орындайтын asyncio үшін бірнеше негізгі Python 3.5 оқулықтарын көрдім. Бұл кодта:

 import asyncio async def doit(i): print("Start %d" % i) await asyncio.sleep(3) print("End %d" % i) return i if __name__ == '__main__': loop = asyncio.get_event_loop() #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)] #futures = [loop.create_task(doit(i)) for i in range(10)] futures = [doit(i) for i in range(10)] result = loop.run_until_complete(asyncio.gather(*futures)) print(result) 

futures айнымалыларын анықтайтын жоғарыда аталған барлық үш опция бірдей нәтижеге жетеді; Мен көріп отырған жалғыз айырмашылық, үшінші нұсқада орындау орындалу тәртібін сақтамайды (ол көп жағдайда маңызды емес). Басқа айырмашылық бар ма? Қарапайым нұсқаны (әдеттегі түзету тізімін) қолдануға болмайтын жағдайлар бар ма?

33
31 марта '16 в 23:15 2016-03-31 23:15 crusaderky 31 наурыз 16 сағат 23:15 2016-03-31 23:15 берілген
@ 3 жауаптар

ensure_future vs create_task

ensure_future - бұл Task coroutine құру әдісі. Ол аргументке негізделген әртүрлі әдістермен (соның ішінде, create_task бағдарламасын және болашақ нысандар үшін) қолдануды жасайды.

create_task - AbstractEventLoop дерексіз әдісі. Әртүрлі оқиғалар циклі бұл мүмкіндікті түрлі жолдармен жүзеге асыра алады.

Тапсырмаларды жасау үшін ensure_future пайдалану керек. Оқиға циклінің өзіңіздің түрін жүзеге асыратын болсаңыз, тек 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') # Now you want to start long_operation, but you don't want to wait it finised: # long_operation should be started, but second msg should be printed immediately. # Create task to do so: task = asyncio.ensure_future(long_operation()) await msg('second') # Now, when you want, you can await task finised: 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() тек await long_operation() функциясын await long_operation() отырып, ауыстыра аласыз.

36
05 апр. Жауап Михаил Герасимов 05 сәуір. 2016-04-05 04:11 '16, 4 : 11- те 2016-04-05 04:11

create_task()

  • сопақшалар алады
  • тапсырманы қайтарады
  • Ол циклдің контекстінде деп аталады.

ensure_future()

  • фьючерстерді, сопроводы, күтілетін баптарды,
  • тапсырманы қайтарады (немесе болашақ болса болашақ).
  • егер берілген arg argument болса, онда create_task ,
  • цикл объектісі берілуі мүмкін.

Көріп отырғаныңыздай, нақты конструктор create_task болып табылады.

border=0

create_taks немесе secure_futureсіз синхрондау функциясы

Қарапайым шақыру функциясы async қайтарады

 >>> async def doit(i): ... await asyncio.sleep(3) ... return i >>> doit(4) <coroutine object doit at 0x7f91e8e80ba0> 

Себебі ensure_future астындағы ensure_future фьючерстің кепілдігі (кепілдік беру) болып табылады, өйткені бұл кепілдік босатылады.

Ұқсас сұрау loop.create_task, asyncio.async / security_future және Task арасындағы айырмашылық қандай?

16
01 апр. жауап kwarunek берілді 01 apr. 2016-04-01 10:48 '16 сағат 10:48, 2016-04-01 10:48

Сіздің мысалыңыз үшін барлық үш түрлер синхронды түрде орындалады. жалғыз айырмашылығы, үшінші мысалда барлық 10 корутиналар алдын ала жасалып, циклды бірге жібереді. сондықтан соңғы тек қана кездейсоқ шығуға мүмкіндік береді.

0
18 июня '17 в 13:52 2017-06-18 13:52 жауап 18 маусымда, 17 сағатта 1:52 2017-05-06-18 13:52

тегтеріне қатысты басқа сұрақтар немесе Сұрақ қою