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_futureoluşturmak için bir yöntemdir Taskgelen coroutine. create_taskArgümana dayalı olarak farklı şekillerde görevler oluşturur ( eşgüdümler ve geleceğe benzer nesneler için kullanımı dahil ).
create_tasksoyut bir yöntemdir AbstractEventLoop. Farklı olay döngüleri bu işlevi farklı şekillerde uygulayabilir.
Görev ensure_futureoluşturmak için kullanmalısınız . create_taskYalnı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 Futureve 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_futureBaş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.spawnveya gibi bazı fikirler içerirasyncio.create_task ).
Ayrıca benim görüşüme göre, Awaitableyalnı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