2015-04-21 13 views
7

का केवल एक ही चरण चलाने के लिए संभव है, मैं एसिन्सीओ और टिंकर का उपयोग करके एक साधारण ग्राफिकल नेटवर्क एप्लिकेशन पर काम कर रहा हूं। मैं asyncio इवेंट लूप को Tk के mainloop के साथ संयोजन करने की समस्या में भाग रहा हूं। यदि संभव हो, तो मैं इसे धागे के बिना करना चाहता हूं, क्योंकि इन दोनों पुस्तकालयों (लेकिन विशेष रूप से टिंकर) बहुत धागे सुरक्षित नहीं हैं। वर्तमान में, मैं एक asyncio coroutine है, जो केवल टी घटना पाश की एक एकल पुनरावृत्ति चलाता में Tk.update उपयोग कर रहा हूँ:क्या एसिन्सीओ इवेंट लूप

@asyncio.coroutine 
def run_tk(tk, interval=0.1): 
    try: 
     while True: 
      tk.update() 
      yield from asyncio.sleep(interval) 
    except TclError as e: 
     if "application has been destroyed" not in e.args[0]: 
      raise 

हालांकि सभी विकल्प तलाश के हित में, मैं अगर यह संभव हो गया था सोच रहा था रिवर्स करने के लिए- यदि एक टीके कॉलबैक के अंदर एक एसिन्सीओ इवेंट लूप के केवल एक ही पुनरावृत्ति का आह्वान करना संभव था।

+0

आप (https://github.com/python/asyncio/issues/ [asyncio साथ टी मुख्य पाश गठबंधन] कर सकते हैं 21), लेकिन मुझे नहीं पता कि क्या यह आपको अभी भी नेटवर्क यातायात को संसाधित करने की अनुमति देता है (यानी नेटवर्क घटनाएं मुख्य लूप में कैसे चलती हैं)? –

+0

ऐसा प्रतीत होता है कि यह काम करेगा, लेकिन यह धोखा देती है- यह एक TkEventLoop बनाता है, जो अनिवार्य रूप से लूप में 'अपडेट' चलाता है, लेकिन नेटवर्क I/o करने के लिए पारंपरिक ईवेंट लूप भी बनाता है और इसे थ्रेड में चलाता है। यह दोनों दुनिया में सबसे खराब है; एकमात्र फायदा यह है कि प्रत्यक्ष कॉलबैक ('loop.call_later') सीधे ईवेंट इवेंट लूप में आवेदित होते हैं। – Lucretiel

+0

मुझे प्रश्न में और उत्तरों में एक न्यूनतम कामकाजी उदाहरण याद आ रहा है। – buhtz

उत्तर

9

loop.run_once() जैसी सार्वजनिक विधि की अनुपस्थिति जानबूझकर है। प्रत्येक समर्थित ईवेंट लूप में एक चरण को फिर से चलाने की विधि नहीं है। अक्सर अंतर्निहित एपीआई में इवेंट लूप बनाने और इसे हमेशा के लिए चलाने के तरीके होते हैं लेकिन एकल चरण को अनुकरण करना बहुत अप्रभावी हो सकता है।

आप एकल कदम यात्रा लागू कर सकते हैं क्या तुम सच में यह की जरूरत है आसान:

import asyncio 


def run_once(loop): 
    loop.call_soon(loop.stop) 
    loop.run_forever() 


loop = asyncio.get_event_loop() 

for i in range(100): 
    print('Iteration', i) 
    run_once(loop) 
+0

प्रतीक्षा करें ... क्या? 'Run_forever' केवल एक बार कैसे चलाता है? इसका अर्थ कैसे निकलता है? – vitiral

+1

@cloudformdesign एक स्पष्टीकरण के लिए मेरा जवाब [यहां] (http://stackoverflow.com/a/29868627/2073595) देखें। – dano

+0

और यह मेरा सवाल था! धन्यवाद! – vitiral

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