मुझे अक्सर आश्चर्य हुआ कि multiprocessing पर पाइथन का दस्तावेज़ पृष्ठ केवल "कार्यात्मक" दृष्टिकोण दिखाता है (target
पैरामीटर का उपयोग करके)। शायद क्योंकि terse, संक्षेप कोड स्निपेट चित्रण उद्देश्यों के लिए सबसे अच्छे हैं। छोटे कार्यों कि एक समारोह में फिट के लिए, मैं देख सकते हैं कि कि पसंदीदा तरीका, आला है:
from multiprocessing import Process
def f():
print('hello')
p = Process(target=f)
p.start()
p.join()
लेकिन जब आप अधिक से अधिक कोड संगठन (जटिल कार्यों के लिए) की जरूरत है, अपने स्वयं के वर्ग बनाने जाने का रास्ता है :
from multiprocessing import Process
class P(Process):
def __init__(self):
super(P, self).__init__()
def run(self):
print('hello')
p = P()
p.start()
p.join()
ध्यान रखें कि प्रत्येक स्पॉन्डेड प्रक्रिया मास्टर प्रक्रिया के स्मृति पदचिह्न की एक प्रति के साथ शुरू की जाती है। और यह कि कन्स्ट्रक्टर कोड (यानी __init__()
के अंदर सामान) मास्टर प्रक्रिया में निष्पादित किया गया है - केवल run()
के अंदर कोड अलग प्रक्रियाओं में निष्पादित करता है।
इसलिए, यदि एक प्रक्रिया (मास्टर या पैदा की) बदलता है यह सदस्य चर, परिवर्तन अन्य प्रक्रियाओं में परिलक्षित नहीं किया जाएगा। यह, बेशक, bool
, string
, list
, आदि जैसे बुलेट-इन प्रकारों के लिए केवल सत्य है। हालांकि आप multiprocessing
मॉड्यूल से "विशेष" डेटा संरचनाएं आयात कर सकते हैं जिन्हें पारदर्शी रूप से प्रक्रियाओं के बीच साझा किया जाता है (Sharing state between processes देखें।) या, आप आईपीसी (इंटर-प्रोसेस संचार) जैसे multiprocessing.Pipe
और multiprocessing.Queue
के अपने स्वयं के चैनल बना सकते हैं।
स्रोत
2013-06-20 18:09:17
अपने प्रश्न के पहले भाग के लिए, अगर आप चाहते हैं एक समारोह जब एक वस्तु instantiated है तो आप कक्षाएं '__init__' समारोह में इसे करने के लिए एक कॉल कर सकते हैं निष्पादित किया जाना है। आप भी [संपत्ति सजावट] (http://docs.python.org/2/library/functions.html#property) भी कर सकते हैं। मुझे यकीन नहीं है कि आप दूसरे भाग में क्या पूछ रहे हैं। क्या आप स्पष्टीकरण दे सकते हैं? –
अक्सर आप ऑब्जेक्ट के संदर्भ के माध्यम से क्लास विधियों का आह्वान करेंगे, जैसे 'x.doSomthing() '। जैसे ही ऑब्जेक्ट को क्लास '__init__' विधि से बुलाया जाता है, आप आंतरिक रूप से विधियों का उपयोग भी कर सकते हैं। यदि आप ऑब्जेक्ट के तरीकों को "प्रक्रिया के रूप में चलाने" के लिए चाहते हैं, तो ऐसा करने के कई तरीके हैं। मेरा व्यक्तिगत पसंदीदा 'प्रक्रिया' से उपclass है। मैं इसे यहां करने का एक तरीका बताता हूं: http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH