2014-10-09 6 views
14

asyncio के लिए दस्तावेज़ प्रिंट करने के बारे "नमस्ते दुनिया" हर दो सेकंड के लिए दो उदाहरण देता है: 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-coroutineपाइथन दुभाषिया को निलंबित किए बिना पृष्ठभूमि में एसिंसिओ इवेंट लूप चला सकता है?

मैं दुभाषिया से उन चला सकते हैं, लेकिन मैं दुभाषिया के लिए उपयोग खो देते हैं तो मुझे क्या करना। क्या पृष्ठभूमि में एसिन्सीओ इवेंट लूप चलाया जा सकता है, ताकि मैं दुभाषिया पर टाइपिंग कमांड रख सकूं?

>>> 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 

ध्यान दें कि आप चाहिए कॉल asyncio.set_event_looploop पर, अन्यथा आप एक त्रुटि मिल जाएगा कह रही है कि वर्तमान धागा नहीं है:

उत्तर

29

आप एक पृष्ठभूमि धागा अंदर घटना पाश चला सकते हैं एक घटना पाश

आप मुख्य थ्रेड से घटना पाश के साथ बातचीत करना चाहते हैं, तो आप loop.call_soon_threadsafe कॉल करने के लिए छड़ी की आवश्यकता होगी।

जबकि इस तरह की चीज दुभाषिया में प्रयोग करने का एक अच्छा तरीका है, वास्तविक कार्यक्रमों में, आप शायद सभी अपने कोड को थ्रेड प्रस्तुत करने के बजाए ईवेंट लूप के अंदर चल रहे हैं।

+1

आपको बहुत बहुत धन्यवाद। किसी व्यक्ति ने [कहीं] (http://monome.org/community/discussion/comment/208744#Comment_208744) धागे और asyncio का मिश्रण न कहा। क्या आप असहमत हैं? प्रक्रिया पृष्ठभूमि एक ओएससी सर्वर होगा। दुभाषिया से मैं यह बताउंगा कि कौन से संकेत भेजना है। पाइथन प्रक्रिया हल्के वजन होगी, निर्देशों को भेजना (शायद 20 बंडल एक सेकेंड) सिंथेसाइज़र को जो सभी ऑडियो गणित करते हैं। प्रेरणा को देखते हुए, क्या आप मुख्य लूप में सब कुछ डालने का सुझाव देना जारी रखते हैं? –

+0

@ user916142 ठीक है, आमतौर पर 'asyncio' जैसे एसिंक्रोनस फ्रेमवर्क का उपयोग करने का पूरा बिंदु थ्रेड का उपयोग करके * से बचने के लिए है। यदि आप हमेशा इस कोड को एक इंटरैक्टिव दुभाषिया के अंदर चलाने जा रहे हैं, तो मुझे लगता है कि यह समझ में आता है। लेकिन आम तौर पर मैं कहूंगा कि आपको 'asyncio' 'Procotol' या' Stream' लागू करना चाहिए जो आने वाले नेटवर्क कनेक्शन को संभालता है, और फिर बताएं कि नेटवर्क अनुरोधों के माध्यम से कौन से संकेत भेजना है। – dano

+0

धन्यवाद! मुझे OS9, Midi, WebSockets, और धारावाहिक डेटा स्ट्रीम को संभालने वाले धागे के साथ उपयोगकर्ता 916142 की तरह कुछ मिल गया है। मैं इसे सभी को एक घटना लूप में घुमाने की संभावना को देखूंगा, लेकिन अब केवल एक वेबसाकेट मॉड्यूल को एकीकृत करने की आवश्यकता है जो एसिन्सियो पर निर्भर है। – velotron

संबंधित मुद्दे