2015-12-28 14 views
15

एक चल रहे असिन्सियो लूप में कोई नया कोरआउट कैसे जोड़ सकता है? अर्थात। वह जो पहले से ही कोरआउट के सेट को निष्पादित कर रहा है।एक चल रहे asyncio पाश में coroutine जोड़ने के लिए कैसे?

मुझे लगता है कि एक कामकाज के रूप में मौजूदा कोरआउट को पूरा करने के लिए इंतजार कर सकता है और फिर एक नया पाश (अतिरिक्त कोरआउटिन के साथ) शुरू कर सकता है। लेकिन क्या कोई बेहतर तरीका है?

उत्तर

9

आप नए coroutines का समय निर्धारण के लिए create_task उपयोग कर सकते हैं:

import asyncio 

async def cor1(): 
    ... 

async def cor2(): 
    ... 

async def main(loop): 
    await asyncio.sleep(0) 
    t1 = loop.create_task(cor1()) 
    await cor2() 
    await t1 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main(loop)) 
loop.close() 
+2

प्रयास के लिए धन्यवाद, लेकिन जहां तक ​​मैं समझता हूँ, इस सवाल का जवाब गलत है। यहां 'मुख्य' का पहला आवेषण कोरआउटिन बनाता है और उसके बाद लूप शुरू होता है। दूसरे शब्दों में, यह उदाहरण लूप शुरू होने से पहले कोरआउट को शेड्यूल करता है। जो मैंने नहीं पूछा वह है। – Petri

+0

'मुख्य' बस एक रैपर के रूप में है; मैं सिर्फ 'loop.create_task' के उपयोग को इंगित करना चाहता था। 'create_task' वही करता है जो आप चाहते हैं। - मैंने यह स्पष्ट करने के लिए उदाहरण संपादित किया है कि 'create_task' चलाने से पहले 'मुख्य' ब्लॉक होगा। –

7

आपका प्रश्न करने के लिए बहुत करीब है "कैसे कार्यक्रम चलाने के लिए समारोह कॉल जोड़ने के लिए?"

जब आपको ईवेंट लूप में बिल्कुल नया कोरआउट जोड़ना होगा?

चलो कुछ उदाहरण देखें। यहां कार्यक्रम कि parallely दो coroutines के साथ घटना पाश शुरू होता है:

import asyncio 
from random import randint 


async def coro1(): 
    res = randint(0,3) 
    await asyncio.sleep(res) 
    print('coro1 finished with output {}'.format(res)) 
    return res 

async def main(): 
    await asyncio.gather(
     coro1(), 
     coro1() 
    ) # here we have two coroutines running parallely 

if __name__ == "__main__": 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(main()) 

आउटपुट:

coro1 finished with output 1 
coro1 finished with output 2 
[Finished in 2.2s] 

हो सकता है आप कुछ coroutines कि coro1 के परिणाम ले जाएगा जोड़ सकते हैं और जैसे ही यह तैयार है इसका इस्तेमाल करने की जरूरत है? उस मामले में सिर्फ coroutine कि coro1 का इंतजार है और यह मूल्य लौटा रहा है का उपयोग बनाने के लिए:

import asyncio 
from random import randint 


async def coro1(): 
    res = randint(0,3) 
    await asyncio.sleep(res) 
    print('coro1 finished with output {}'.format(res)) 
    return res 

async def coro2(): 
    res = await coro1() 
    res = res * res 
    await asyncio.sleep(res) 
    print('coro2 finished with output {}'.format(res)) 
    return res 

async def main(): 
    await asyncio.gather(
     coro2(), 
     coro2() 
    ) # here we have two coroutines running parallely 

if __name__ == "__main__": 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(main()) 

आउटपुट:

coro1 finished with output 1 
coro2 finished with output 1 
coro1 finished with output 3 
coro2 finished with output 9 
[Finished in 12.2s] 

विशिष्ट वाक्यविन्यास के साथ नियमित कार्यों के बारे में के रूप में coroutines के बारे में सोचो। आप समांतर रूप से निष्पादित करने के लिए कुछ फ़ंक्शन शुरू कर सकते हैं (asyncio.gather द्वारा), आप पहले किए जाने के बाद अगला फ़ंक्शन शुरू कर सकते हैं, आप नए फ़ंक्शन बना सकते हैं जो दूसरों को कॉल करते हैं।

+3

कोरोटाइन्स रन * समवर्ती *, * समानांतर * में नहीं। काफी वही बात नहीं है। –

4

एक पहले से ही चल रहा है घटना पाश में फ़ंक्शन जोड़ने आप उपयोग कर सकते हैं करने के लिए:

asyncio.ensure_future(my_coro())

मेरे मामले में मैं asyncio के साथ बहु सूत्रण (threading) का उपयोग किया गया था और घटना पाश करने के लिए एक कार्य जोड़ने के लिए चाहते थे कि पहले से चल रहा था किसी भी स्थिति में किसी और स्थिति के लिए, ईवेंट लूप को स्पष्ट रूप से बताना सुनिश्चित करें (जैसा कि Thread के अंदर मौजूद नहीं है)। अर्थात:

वैश्विक क्षेत्र में:

event_loop = asyncio.get_event_loop() 
बाद में

फिर, अपने Thread अंदर:

asyncio.ensure_future(my_coro(), loop=event_loop) 
संबंधित मुद्दे