2015-05-31 6 views
5

मुझे समझ में समस्या आ रही है कि पहले से चल रहे ईवेंट लूप में नया कार्य कैसे करें।एसिंसिओ को पहले से ही हमेशा के लिए चल रहा है और लंबित कार्यों

इस कोड:

import asyncio 
import logging 

@asyncio.coroutine 
def blocking(cmd): 
    while True: 
     logging.info("in blocking coroutine") 
     yield from asyncio.sleep(0.01) 
     print("ping") 

def main(): 
    logging.info("in main funciton") 
    loop = asyncio.get_event_loop() 
    logging.info("new loop created") 
    logging.info("loop running forever") 
    loop.run_forever() 
    asyncio.async(blocking("ls")) 

logging.basicConfig(level = logging.INFO) 
main() 

run_forever() बदलने run_until_complete(asyncio.async(blocking("ls")) को ठीक काम करता है। लेकिन मैं वास्तव में उलझन में हूं - मैं पहले से चल रहे लूप पर एक कार्य क्यों नहीं दे सकता?

उत्तर

10

समस्या यह है कि loop.run_forever() ब्लॉक पर कॉल; यह इवेंट लूप शुरू करता है, और तब तक वापस नहीं आ जाएगा जब तक आप स्पष्ट रूप से लूप को रोक नहीं देते - इसलिए foreverrun_forever का हिस्सा। आपका प्रोग्राम कभी भी ईवेंट लूप को स्पष्ट रूप से बंद नहीं करता है, इसलिए आपका asyncio.async(blocking("ls")) कॉल कभी नहीं पहुंचता है।

एक पहले से ही चल रहा है पाश के लिए एक नया कार्य जोड़ने के लिए asyncio.async का उपयोग करना ठीक तुम सिर्फ यकीन है कि समारोह वास्तव में एक coroutine या घटना पाश अंदर कॉलबैक अंदर से कहा जाता है बनाने की जरूरत है है।

अनुसूची के रूप में घटना पाश शुरू होता है blocking जैसे ही चलाने के लिए:

def main(): 
    logging.info("in main funciton") 
    loop = asyncio.get_event_loop() 
    logging.info("new loop created") 
    logging.info("loop running forever") 
    asyncio.async(blocking("ls")) 
    loop.run_forever() 

अनुसूची blocking एक कॉलबैक घटना पाश द्वारा निष्पादित से:

def start_blocking(): 
    asyncio.async(blocking("ls")) 

def main(): 
    logging.info("in main funciton") 
    loop = asyncio.get_event_loop() 
    logging.info("new loop created") 
    logging.info("loop running forever") 
    loop.call_soon(start_blocking) # Calls start_blocking once the event loop starts 
    loop.run_forever() 
कुछ उदाहरण हैं
संबंधित मुद्दे