मैं निम्नलिखित कोड है बंद करने से पहले खत्म करने के लिए:जब asyncio का उपयोग कर, आप कैसे अनुमति नहीं सभी में चल रहे कार्यों घटना पाश
@asyncio.coroutine
def do_something_periodically():
while True:
asyncio.async(my_expensive_operation())
yield from asyncio.sleep(my_interval)
if shutdown_flag_is_set:
print("Shutting down")
break
मैं पूरा जब तक इस समारोह चलाते हैं। समस्या तब होती है जब शट डाउन सेट होता है - फ़ंक्शन पूरा हो जाता है और कोई लंबित कार्य कभी नहीं चलाया जाता है। (आप इसे एक त्रुटि के रूप में देखते हैं
task: <Task pending coro=<report() running at script.py:33> wait_for=<Future pending cb=[Task._wakeup()]>>
)। मैं शट डाउन को सही तरीके से कैसे शेड्यूल करूं?
कुछ संदर्भ देने के लिए, मैं एक सिस्टम मॉनिटर लिख रहा हूं जो हर 5 सेकंड में/proc/stat से पढ़ता है, उस अवधि में सीपीयू उपयोग की गणना करता है, और फिर परिणाम को सर्वर पर भेजता है। मैं इन निगरानी नौकरियों को शेड्यूल करना चाहता हूं जब तक कि मैं सिगरेट प्राप्त नहीं करता, जब मैं शेड्यूलिंग रोकता हूं, सभी मौजूदा नौकरियों को समाप्त करने की प्रतीक्षा करता हूं, और शानदार तरीके से बाहर निकलता हूं।
कुछ संदर्भ देने के लिए, मैं एक प्रणाली की निगरानी से दूर/proc/stat हर 5 सेकंड पढ़ता लिख रहा हूँ: इस मामले में, के बाद से सभी कार्य एक ही coroutine में बनाए जाते हैं, आप पहले से ही कार्य के लिए उपयोग किया , उस अवधि में सीपीयू उपयोग की गणना करता है, और फिर परिणाम को एक से भेजता है rver। मैं इन निगरानी नौकरियों को शेड्यूल करना चाहता हूं जब तक कि मैं सिगरेट प्राप्त नहीं करता, जब मैं शेड्यूलिंग रोकता हूं, सभी मौजूदा नौकरियों को समाप्त करने की प्रतीक्षा करता हूं, और शानदार तरीके से बाहर निकलता हूं। – derekdreery
क्या आपने my_expensive_operation() \ n से उपज की कोशिश की है asyncio.sleep (my_interval - timer()% my_interval) 'इसके बजाय? – jfs
मैं बस इतनी देर तक सो सकता था कि मुझे पता है कि सब कुछ खत्म हो गया है, लेकिन यह बहुत साफ नहीं लगता है। मैं सोच रहा था कि कार्यों को शेड्यूल करने का कोई तरीका था या फिर लूप चलाएं जब तक सभी निर्धारित कार्य पूर्ण नहीं हो जाते। जावास्क्रिप्ट (node.js) में, यदि मुख्य प्रोग्राम अंत तक पहुंचता है लेकिन कॉलबैक सेट होते हैं, तो प्रक्रिया तब तक चलती है जब तक सभी कॉलबैक हटा दिए जाते हैं। – derekdreery