2016-10-19 22 views
5

asyncio için Python belgelerinden geçiyordum ve çoğu örnekte neden 'un aksine kullanıldığını merak ediyorum. ÖrneğinNeden çoğu asyncio örneği loop.run_until_complete() kullanıyor?

: https://docs.python.org/dev/library/asyncio-task.html

O ensure_future engellenmeyen fonksiyonların avantajlarını göstermek için çok daha iyi bir yol olacağını görünüyor. Diğer yandan, run_until_complete, senkronize işlevler gibi döngüyü engeller.

Bu, ensure_futureloop.run_forever() ile eşzamanlı olarak birden fazla birlikte çalışma rutinini çalıştırmak yerine run_until_complete kullanmam gerektiğini hissettiriyor. Bitene kadar bir geleceği çalıştırmak için

+2

'run_until_complete' hiçbir şeyi engellemiyor. 'Run_forever' ile arasındaki fark, döngünün, koroutinin tamamlanmasında duraklamasıdır. Engellenecek tek şey, eğer koloniniz asla beklemez. – dirn

+1

Bu http://pastebin.com/Qi8dQ3bh yazdım ve yine de döngüyü engelliyor gibi görünüyor. do_io() 'uykuyu beklese bile, do_io()' yapana kadar do_other_things() 'işlevi yürütülmez. – SamuelN

+2

Bu, döngüde başka hiçbir şey planlanmadığı için. 'Run_forever' çağırmadan önce' loop.create_task (do_other_things()) 'ifadesini aramayı deneyin. – dirn

cevap

5

run_until_complete kullanılır. Bunu takip eden kodun yürütülmesini engeller. Ancak, olay döngüsünün çalışmasına neden olur. Planlanan tüm gelecekler, gelecek run_until_complete'a iletilene kadar çalışır.

import asyncio 

async def do_io(): 
    print('io start') 
    await asyncio.sleep(5) 
    print('io end') 

async def do_other_things(): 
    print('doing other thigns') 

loop = asyncio.get_event_loop() 

loop.run_until_complete(do_io()) 
loop.run_until_complete(do_other_things()) 

loop.close() 

do_io çalışacaktır:

bu örneği göz önüne alındığında. Tamamlandıktan sonra do_other_things çalışır. Eğer do_io çalıştırmadan önce olay döngü ile do_other_things planlarsanız Çıktınız

io start 
io end 
doing other thigns 

olacak kontrolü do_io den do_other_things zaman eski bekliyor geçer.

loop.create_task(do_other_things()) 
loop.run_until_complete(do_io()) 

Bu size

do_other_thingsdo_io önce planlandı Bunun nedeni çıktısını alacak. Çıkışın

doing other thigns 
io start 
io end 

olması için birçok farklı yol vardır, ancak hangisinin gerçekten mantıklı olduğunu uygulamanızın gerçekte ne yaptığına bağlıdır. Böylece bunu okuyucuya bir egzersiz olarak bırakacağım.

İlgili konular