2014-10-09 17 views
14

dokümantasyon "Hello World" iki saniyede nasıl yazdırılacağı için iki örnek verilmektedir: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio-hello-world-callback https://docs.python.org/3/library/asyncio-task.html#asyncio-hello-world-coroutineBir asyncio olay döngüsü, Python yorumlayıcısını askıya almadan arka planda çalışır mı? asyncio için

Ben tercüman gelenler çalışabilir, ancak bunu yaparsam ben tercüman erişimi kaybeder. Bir asyncio olay döngüsü arka planda çalıştırılabilir, böylece yorumlayıcıya komut yazabilirmiyim? Geçerli iş parçacığı yok diyerek loop üzerinde size zorunluluk çağrı asyncio.set_event_loop, aksi halde hata alırsınız

>>> import asyncio 
>>> 
>>> @asyncio.coroutine 
... def greet_every_two_seconds(): 
...  while True: 
...   print('Hello World') 
...   yield from asyncio.sleep(2) 
... 
>>> def loop_in_thread(loop): 
...  asyncio.set_event_loop(loop) 
...  loop.run_until_complete(greet_every_two_seconds()) 
... 
>>> 
>>> loop = asyncio.get_event_loop() 
>>> import threading 
>>> t = threading.Thread(target=loop_in_thread, args=(loop,)) 
>>> t.start() 
Hello World 
>>> 
>>> Hello World 

Not:

cevap

29

bir arka plan iş parçacığı içindeki olay döngü çalıştırabilirsiniz bir olay döngüsü.

Olay iş parçacığı ile ana iş parçacığı arasında etkileşim kurmak istiyorsanız, loop.call_soon_threadsafe çağrılarına bağlı kalmanız gerekir.

Bu tür bir şey, yorumlayıcıda deneme yapmak için iyi bir yol olsa da, gerçek programlarda, iş parçacığı tanıtmak yerine, olay döngüsünde çalışan kodunuzu muhtemelen tüm istersiniz.

+1

Çok teşekkür ederim. Birisi [http://monome.org/community/discussion/comment/208744#Comment_208744] konuları ve asyncio'yu karıştırmamayı söyledi. Katılmıyor musun İşlem arka planda bir OSC sunucusudur. Tercümandan, hangi sinyallerin gönderileceğini söylerdim. Python işlemi, tüm ses matematiğini yapan synthesizer'lara talimatlar göndererek (belki saniyede 20 paket) hafif olacaktır. Bu motivasyonu göz önünde bulundurarak, her şeyi ana döngüde yerleştirmeyi öneriyor musunuz? –

+0

@ user916142 Normalde, "asyncio" gibi bir asenkron çerçeveyi kullanmanın tüm noktası, iş parçacıkları kullanarak * kaçınmaktır. Bu kodu her zaman etkileşimli bir tercüman içinde yürütecekseniz, mantıklı olduğunu düşünüyorum. Ancak normalde, gelen ağ bağlantılarını yöneten bir "asyncio" Procotol veya "Stream" uygulamanız gerektiğini söylerim ve sonra ağ istekleri yoluyla hangi sinyallerin gönderileceğini söylersiniz. – dano

+0

Teşekkürler! OSC, Midi, WebSockets ve seri veri akışlarını işleyen thread ile user916142 gibi bir şey var. Hepsini bir olay döngüsüne yerleştirme olasılığına bakacağım, ancak şimdilik sadece asyncio'ya bağlı bir WebSockets modülünü entegre etmek gerekiyordu. – velotron

İlgili konular