Gerçek bilgi:
Python 3.7'den başlayarak asyncio.create_task(coro)
üst düzey fonksiyon bu amaçla eklendi .
Zaman zamanlarından görev oluşturmanın başka yolları yerine onu kullanmalısınız. Bununla birlikte, keyfi olarak beklenebilir bir görev oluşturmanız gerekiyorsa, kullanmalısınız asyncio.ensure_future(obj)
.
Eski bilgi:
ensure_future
vs create_task
ensure_future
oluşturmak için bir yöntemdir Task
gelen coroutine
. create_task
Argümana dayalı olarak farklı şekillerde görevler oluşturur ( eşgüdümler ve geleceğe benzer nesneler için kullanımı dahil ).
create_task
soyut bir yöntemdir AbstractEventLoop
. Farklı olay döngüleri bu işlevi farklı şekillerde uygulayabilir.
Görev ensure_future
oluşturmak için kullanmalısınız . create_task
Yalnızca kendi olay döngü türünüzü uygulayacaksanız ihtiyacınız olacak.
Güncelleme:
@ bj0, Guido'nun bu konudaki cevabına işaret etti :
Buradaki nokta, ensure_future()
bir coroutine veya a olabilen bir şeye sahipseniz Future
(ikincisi, a'yı içerir, Task
çünkü bu bir alt sınıfıdır Future
) ve üzerinde yalnızca tanımlanmış bir yöntemi çağırmak istiyorsanız Future
(muhtemelen tek faydalı örnek olmak cancel()
). Zaten bir Future
(veya Task
) olduğunda bu hiçbir şey yapmaz; Bir eşyordam olduğunda sarar bir onu Task
.
Bir coroutine sahip olduğunuzu biliyorsanız ve bunun planlanmasını istiyorsanız, kullanılacak doğru API create_task()
. ensure_future()
Aramanız gereken tek zaman, bir coroutine veya a'yı kabul eden bir API (asenkronizasyonun kendi API'lerinin çoğu gibi) sağladığınız Future
ve ona sahip olmanızı gerektiren bir şey yapmanız gerektiği zamandır Future
.
ve sonra:
Sonunda hala bunun ensure_future()
nadiren ihtiyaç duyulan bir işlevsellik parçası için uygun şekilde belirsiz bir isim olduğuna inanıyorum . Bir eşdizimden görev oluştururken, uygun şekilde adlandırılmış olanı kullanmalısınız
loop.create_task()
. Belki bunun için bir takma ad olmalı
asyncio.create_task()
?
Benim için şaşırtıcı. ensure_future
Baştan sona kullanmak için ana motivasyonum, loop üyesine kıyasla daha üst düzey bir işlev olmasıydı create_task
(tartışma , ekleme asyncio.spawn
veya gibi bazı fikirler içerirasyncio.create_task
).
Ayrıca benim görüşüme göre, Awaitable
yalnızca koroutinler yerine herhangi birini işleyebilen evrensel işlevi kullanmanın oldukça uygun olduğunu söyleyebilirim .
Bununla birlikte, Guido'nun cevabı açıktır: "Bir eşdizimden bir görev oluştururken, uygun şekilde adlandırılmış olanı kullanmalısınız loop.create_task()
"
Eşgörünümler ne zaman görevlere sarılmalıdır?
Coroutine'i Göreve Sarma - bu coroutini "arka planda" başlatmanın bir yoludur. İşte örnek:
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())
Çıktı:
first
long_operation started
second
long_operation finished
asyncio.ensure_future(long_operation())
Sadece await long_operation()
farkı hissetmek için yerine koyabilirsiniz .
create_task
, normalde ihtiyaç duymamanız