2012-10-12 20 views
5

यदि आप मल्टीप्रोसेसिंग का उपयोग करते हैं और गलती से creating processes without limit समाप्त करते हैं तो ओएस इसे पसंद नहीं करेगा।मल्टीप्रोसेसिंग "रनवे बग" को रोकना

क्या कोई आसान समाधान है जो इसे होने से रोकता है (कहें, प्रक्रियाओं की कुल संख्या सीमित करके, या तो पायथन या ओएस में)?

मैं विंडोज का उपयोग करता हूं, और जब मैं गलती करता हूं तो यह वास्तव में बुरी तरह से व्यवहार करता है (हार्ड रीबूट की आवश्यकता होती है)। तो मुझे यह अच्छा लगेगा अगर कुछ कोड है जो मैं अपने आवेदन में चारों ओर लपेट सकता/जोड़ सकता हूं और इसे होने से रोक सकता हूं।

+0

यदि यह एक विंडोज़ सवाल है- यह लिनक्स क्यों टैग किया जाता है? – tMC

+0

आदर्श रूप से मैं लिनक्स के लिए समाधान और विंडोज के लिए एक समाधान चाहता हूं! क्षमा करें मैं इसके बारे में स्पष्ट नहीं था ... जाहिर है कि 50% समाधान अभी भी कुछ भी नहीं है। – max

उत्तर

3

आप क्या कर सकते हैं एक छोटा 'ट्रिप-वायर' प्रकार मॉड्यूल बनाते हैं और इसे मल्टीप्रोसेसिंग भी आयात करते हैं। ट्रिप-वायर मॉड्यूल एक अपवाद उठाएगा यदि यह एक मल्टीप्रोसेसिंग अनंत लूप का पता लगाता है।

मेरा इस तरह दिखता है:

#mp_guard.py 
"""tracks invocation by creating an environment variable; if that 
variable exists when next called a loop is in progress""" 

import os 

class Brick(Exception): 
    def __init__(self): 
     Exception.__init__(self, "Your machine just narrowly avoided becoming" 
           " a brick!") 

if 'MP_GUARD' in os.environ: 
    raise Brick 

os.environ['MP_GUARD'] = 'active' 

और मुख्य .py फ़ाइल में:

import mp_guard 
1

लिनक्स पर, आप प्रक्रियाओं की संख्या (उदा fork bombs से बचने के लिए) सीमित करने के लिए (RLIMIT_NPROC के साथ) setrlimit(2) syscall उपयोग कर सकते हैं। यह syscall बिश ulimit (या zsh limit) के माध्यम से अंतर्निहित है। इस सिस्कोल में पाइथन के पास binding है।

मुझे नहीं पता कि विंडोज के तहत कुछ ऐसा ही मौजूद है या नहीं।

+1

जहां तक ​​मैं कह सकता हूं, विंडोज के लिए कुछ भी मौजूद नहीं है ... उनके लिए बेकार है :-( – ephemient

+0

यदि ऐसा है, तो यह वास्तव में बेकार है। यहां तक ​​कि जब विंडोज शटडाउन मोड में जाता है, तो यह प्रक्रियाओं के प्रसार को रोकने में असमर्थ लगता है। लगता है कि Win 7 के लिए बंद होने की कोशिश कर रहे किसी भी नए उपयोगकर्ता द्वारा बनाई गई प्रक्रियाओं को अवरुद्ध करना आसान होगा ... – max

+1

लिनक्स इस समस्या से ग्रस्त नहीं है। –

1

खिड़कियों पर आप "एक नौकरी", मैं एक विशेषज्ञ नहीं हूँ अजगर में बना सकते हैं, इसलिए मुझे नहीं पता कि क्या विंडोज़ नौकरियां बनाने के लिए कोई बाध्यकारी है या नहीं। विंडोज एपीआई फ़ंक्शन CreateJobObject है। यूनिक्स "प्रक्रिया समूह" के बराबर एक नौकरी वस्तु (कुछ हद तक) है। आप नौकरी ऑब्जेक्ट पर पूरी तरह से और प्रत्येक प्रक्रिया को अलग-अलग (उदाहरण के लिए नौकरी में अधिकतम प्रक्रियाओं) पर कुछ सीमाएं लागू कर सकते हैं। आप नौकरी ऑब्जेक्ट बना सकते हैं, प्रक्रियाओं की संख्या को सीमित कर सकते हैं और फिर अपनी ऑब्जेक्ट को जॉब ऑब्जेक्ट में असाइन कर सकते हैं। क्या आप के लिए देख जा सकता है CreateJobObject, SetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS है। दोबारा: यह विंडोज एपीआई है, मुझे यकीन नहीं है कि क्या आपके पास इन कार्यों से संबंधित पायथन के लिए कोई 'बाइंडिंग' है।