Python 3.7

Policies




python

Policies

इवेंट लूप नीति एक वैश्विक प्रति-प्रक्रिया ऑब्जेक्ट है जो ईवेंट लूप के प्रबंधन को नियंत्रित करता है। प्रत्येक ईवेंट लूप में एक डिफ़ॉल्ट नीति होती है, जिसे नीति API का उपयोग करके बदला और अनुकूलित किया जा सकता है।

एक नीति संदर्भ की धारणा को परिभाषित करती है और प्रति संदर्भ एक अलग ईवेंट लूप का प्रबंधन करती है। डिफ़ॉल्ट नीति वर्तमान थ्रेड के संदर्भ को परिभाषित करती है

एक कस्टम ईवेंट लूप नीति का उपयोग करके, get_event_loop() , set_event_loop() , और new_event_loop() फ़ंक्शन को अनुकूलित किया जा सकता है।

नीति ऑब्जेक्ट को AbstractEventLoopPolicy सार आधार वर्ग में परिभाषित API को लागू करना चाहिए।

पॉलिसी प्राप्त करना और स्थापित करना

वर्तमान प्रक्रिया के लिए नीति को प्राप्त करने और निर्धारित करने के लिए निम्नलिखित कार्यों का उपयोग किया जा सकता है:

asyncio.get_event_loop_policy()

वर्तमान प्रक्रिया-व्यापी नीति लौटाएँ।

asyncio.set_event_loop_policy(policy)

वर्तमान प्रक्रिया-व्यापी नीति को नीति पर सेट करें।

यदि नीति None सेट None , तो डिफ़ॉल्ट नीति पुनर्स्थापित की जाती है।

नीति वस्तुएं

सार इवेंट लूप पॉलिसी बेस क्लास निम्नानुसार परिभाषित किया गया है:

class asyncio.AbstractEventLoopPolicy

Asyncio नीतियों के लिए एक सार आधार वर्ग।

get_event_loop()

वर्तमान संदर्भ के लिए ईवेंट लूप प्राप्त करें।

AbstractEventLoop इंटरफ़ेस को लागू करने के लिए एक घटना लूप ऑब्जेक्ट लौटें।

इस विधि को कभी भी वापस None करना चाहिए।

संस्करण 3.6 में बदला गया।

set_event_loop(loop)

वर्तमान लूप के लिए ईवेंट लूप को लूप पर सेट करें।

new_event_loop()

एक नया ईवेंट लूप ऑब्जेक्ट बनाएं और वापस करें।

इस विधि को कभी भी वापस None करना चाहिए।

get_child_watcher()

एक बच्चे की प्रक्रिया पर नजर रखने वाली वस्तु प्राप्त करें।

AbstractChildWatcher इंटरफ़ेस को लागू करने वाला एक वॉचर ऑब्जेक्ट लौटाएं।

यह फ़ंक्शन यूनिक्स विशिष्ट है।

set_child_watcher(watcher)

वर्तमान बाल प्रक्रिया पर नजर रखने वाले पर नजर रखें

यह फ़ंक्शन यूनिक्स विशिष्ट है।

निम्नलिखित अंतर्निहित नीतियों के साथ एसिंसीओ जहाज:

class asyncio.DefaultEventLoopPolicy

डिफ़ॉल्ट asyncio नीति। यूनिक्स और विंडोज दोनों प्लेटफार्मों पर SelectorEventLoop उपयोग करता है।

डिफ़ॉल्ट नीति को मैन्युअल रूप से स्थापित करने की कोई आवश्यकता नहीं है। asyncio को डिफ़ॉल्ट नीति का उपयोग करने के लिए स्वचालित रूप से कॉन्फ़िगर किया गया है।

class asyncio.WindowsProactorEventLoopPolicy

एक वैकल्पिक ईवेंट लूप नीति जो ProactorEventLoop ईवेंट लूप कार्यान्वयन का उपयोग करती है।

उपलब्धता: विंडोज।

प्रक्रिया चौकीदार

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

Asyncio में, बाल प्रक्रिया create_subprocess_exec() और loop.subprocess_exec() फ़ंक्शन के साथ बनाई जाती हैं।

asyncio AbstractChildWatcher अमूर्त आधार वर्ग को परिभाषित करता है, जिसे बच्चे के दर्शकों को लागू करना चाहिए, और दो अलग-अलग कार्यान्वयन हैं: SafeChildWatcher (डिफ़ॉल्ट रूप से उपयोग किए जाने के लिए कॉन्फ़िगर किया गया) और FastChildWatcher

सबप्रोसेस और थ्रेड्स अनुभाग भी देखें।

निम्नलिखित दो कार्यों का उपयोग चाइल्ड प्रोसेस वॉचर कार्यान्वयन को अनुकूलित करने के लिए किया जा सकता है, जिसका उपयोग एसिंको इवेंट लूप द्वारा किया जाता है:

asyncio.get_child_watcher()

वर्तमान नीति के लिए वर्तमान चाइल्ड वॉचर लौटें।

asyncio.set_child_watcher(watcher)

वर्तमान नीति के लिए वर्तमान बच्चे पर नजर रखने वाले को सेट करें। द्रष्टा को AbstractChildWatcher बेस क्लास में परिभाषित विधियों को लागू करना चाहिए।

ध्यान दें

तृतीय-पक्ष ईवेंट लूप्स कार्यान्वयन कस्टम चाइल्ड वॉचर्स का समर्थन नहीं कर सकता है। ऐसे इवेंट लूप के लिए, set_child_watcher() का उपयोग set_child_watcher() प्रतिबंधित हो सकता है या इसका कोई प्रभाव नहीं हो सकता है।

class asyncio.AbstractChildWatcher
add_child_handler(pid, callback, *args)

एक नया चाइल्ड हैंडलर रजिस्टर करें।

callback(pid, returncode, *args) करें जब पीआईडी ​​के साथ एक प्रक्रिया पीआईडी callback(pid, returncode, *args) बराबर हो। उसी प्रक्रिया के लिए एक और कॉलबैक निर्दिष्ट करना पिछले हैंडलर को बदल देता है।

कॉलबैक कॉल करने योग्य थ्रेड-सुरक्षित होना चाहिए।

remove_child_handler(pid)

पीआईडी ​​के साथ प्रक्रिया के लिए हैंडलर को पीआईडी ​​के बराबर हटा देता है।

फ़ंक्शन True यदि हैंडलर को सफलतापूर्वक निकाल दिया गया था, तो False यदि हटाने के लिए कुछ भी नहीं था।

attach_loop(loop)

एक घटना पाश के लिए चौकीदार संलग्न करें।

यदि पहरेदार पहले एक इवेंट लूप से जुड़ा हुआ था, तो नए लूप के साथ संलग्न करने से पहले इसे पहले अलग कर दिया जाता है।

नोट: लूप None हो सकता है।

close()

चौकीदार को बंद करो।

यह सुनिश्चित करने के लिए इस विधि को बुलाया जाना चाहिए कि अंतर्निहित संसाधन साफ ​​किए गए हैं।

class asyncio.SafeChildWatcher

यह कार्यान्वयन SIGCHLD संकेत पर प्रत्येक प्रक्रिया को स्पष्ट रूप से मतदान करके अन्य कोड स्पैनिंग प्रक्रियाओं को बाधित करने से बचता है।

यह एक सुरक्षित उपाय है, लेकिन बड़ी संख्या में प्रक्रियाओं ( O (n) हर बार एक SIGCHLD प्राप्त होने पर) को संभालते समय इसका एक महत्वपूर्ण ओवरहेड होता है।

asyncio डिफ़ॉल्ट रूप से इस सुरक्षित कार्यान्वयन का उपयोग करता है।

class asyncio.FastChildWatcher

यह कार्यान्वयन प्रत्येक समाप्त प्रक्रियाओं को सीधे os.waitpid(-1) कहकर os.waitpid(-1) , संभवत: अन्य कोड os.waitpid(-1) प्रक्रियाओं को तोड़कर उनकी समाप्ति की प्रतीक्षा कर रहा है।

बड़ी संख्या में बच्चों ( ओ (1) हर बार जब बच्चा समाप्त होता है) को संभालते समय कोई ध्यान देने योग्य ओवरहेड नहीं होता है।

कस्टम नीतियाँ

नई ईवेंट लूप नीति को लागू करने के लिए, DefaultEventLoopPolicy को DefaultEventLoopPolicy करने की अनुशंसा की जाती है और उन तरीकों को ओवरराइड किया जाता है जिनके लिए कस्टम व्यवहार चाहता है, जैसे:

class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Get the event loop.

        This may be None or an instance of EventLoop.
        """
        loop = super().get_event_loop()
        # Do something with loop ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())