मैं एक प्रोग्राम लिख रहा हूं जो निम्नलिखित कोड के साथ कई कार्यकर्ता प्रक्रियाओं (एक प्री-फोर्किंग मॉडल) का उपयोग करता है।

from  multiprocessing import Process
for i in range(0,3):
    Process(target=worker, args=(i,)).start()

मैं विंडोज का उपयोग करता हूं। मैंने देखा है कि वे अलग प्रक्रियाओं के रूप में चलाए जाते हैं जब मैं चाहता था कि वे इसके बजाय उपप्रक्रियाओं के रूप में प्रारंभ करें। मैं उन्हें मुख्य प्रक्रिया के उप-प्रक्रिया कैसे बना सकता हूं?

मैं उपप्रक्रिया मॉड्यूल का उपयोग करने में संकोच कर रहा हूं क्योंकि यह बाहरी प्रक्रियाओं को चलाने के लिए उपयुक्त लगता है (जहां तक ​​​​मैंने इसका उपयोग किया है)।


एक अपडेट: ऐसा लगता है कि Windows नई प्रक्रियाओं को उप-प्रक्रियाओं के रूप में लॉन्च नहीं करता है। पाइथन विंडोज़ में getppid() (माता-पिता की पीआईडी ​​​​प्राप्त करें) का समर्थन नहीं करता है।

1
Jesvin Jose 27 सितंबर 2011, 18:34
1
मैंने आपका कोड डिडेंट किया। यदि यह गलत है, तो बेझिझक वापस करें, लेकिन कृपया बताएं कि यह सही इंडेंटेशन क्यों है। संभावित उत्तरदाताओं के लिए प्रतिलिपि प्रस्तुत करने योग्य उदाहरण होना एक बहुत बड़ी सहायता है।
 – 
phihag
27 सितंबर 2011, 18:37

3 जवाब

सबसे बढ़िया उत्तर

आप दीवार उपप्रक्रिया क्या करते हैं? मेरे लिए वे आपकी मुख्य प्रक्रिया की उपप्रक्रिया हैं। यहां मेरा उदाहरण और आउटपुट लौटा।

import time, os
from  multiprocessing import Process

def worker():
    print "I'm process %s, my father is %s" % (os.getpid(), os.getppid())

print "I'm the main process %s" % os.getpid()
for i in range(0,3):
    Process(target=worker).start()

आउटपुट है:

I'm the main process 5897
I'm process 5898, my father is 5897
I'm process 5899, my father is 5897
I'm process 5900, my father is 5897

आपके पास मुख्य प्रक्रिया से जुड़ी 3 उपप्रक्रियाएं हैं ...

3
JC Plessis 27 सितंबर 2011, 18:47
बहुत खूब। आपका कोड अपने लिए बोलता है। बहुत खराब os.getppid() विंडोज़ पर काम नहीं करता है।
 – 
Jesvin Jose
28 सितंबर 2011, 10:21

ऐसा लगता है कि आप यहां भ्रमित शब्दावली कर रहे हैं। एक उपप्रक्रिया है एक अलग प्रक्रिया है। जो प्रक्रियाएं बनाई जाएंगी वे आपके कार्यक्रम की मुख्य प्रक्रिया के बच्चों होंगी, और उस अर्थ में उपप्रक्रियाएं हैं। यदि आप थ्रेड चाहते हैं, तो multiprocessing के बजाय multithreading का उपयोग करें, लेकिन ध्यान दें कि पायथन एकाधिक थ्रेड के लिए एकाधिक कोर/सीपीयू का उपयोग नहीं करेगा।

मुझे subprocess मॉड्यूल का उपयोग करने में संकोच हो रहा है क्योंकि यह बाहरी प्रक्रियाओं को चलाने के लिए उपयुक्त लगता है

मुझे खेद है, मुझे यह टिप्पणी समझ में नहीं आई।

3
Fred Foo 27 सितंबर 2011, 18:42
2
यदि आप Python 3.x का उपयोग कर रहे हैं, तो आप concurrent.futures भी आज़मा सकते हैं, जो थ्रेडिंग के अधिक मैन्युअल बिट्स को छुपाता है।
 – 
Colin
27 सितंबर 2011, 18:43
क्या आप सुनिश्चित हैं कि मल्टीथ्रेडिंग का उपयोग करते समय पायथन एकाधिक कोर का उपयोग नहीं करता है?
 – 
Pih
25 जुलाई 2012, 17:39
@Pih: यदि कोई थ्रेड एक सी एक्सटेंशन में बहुत काम करता है जो जीआईएल जारी करता है, तो यह एक अलग कोर पर अन्य धागे के साथ एक साथ चल सकता है। लेकिन आमतौर पर ऐसा नहीं होगा। wiki.python.org/moin/GlobalInterpreterLock देखें।
 – 
Fred Foo
25 जुलाई 2012, 17:48

संक्षिप्त उत्तर: http://docs.python.org/library/threading.html

लंबे समय तक: मुझे सवाल समझ में नहीं आया, ऐच्च्न्यू। विशिष्ट यूनिक्स मॉडल में, केवल एक प्रक्रिया शुरू हो सकती है हैं उप-प्रक्रियाएं। मुझे एक मजबूत भावना है कि हम दोनों के बीच एक शब्दावली संघर्ष है, मुझे नहीं पता कि कैसे सुलझाया जाए। ऐसा लगता है कि आपके मन में "आंतरिक प्रक्रिया" जैसा कुछ है; किसी भी भाषा या ऑपरेटिंग सिस्टम में इसका उदाहरण क्या है?

मैं प्रमाणित कर सकता हूं कि पायथन का सबप्रोसेस मॉड्यूल व्यापक रूप से उपयोग किया जाता है।

आप लिखते हैं "... कई काम करने वाले सूत्र ..." क्या आपने उस दस्तावेज़ को पढ़ा है जिसका मैं इस प्रतिक्रिया के शीर्ष पर पहली पंक्ति में संदर्भित करता हूं?

1
Cameron Laird 27 सितंबर 2011, 18:46
मैंने इसे "एकाधिक कामकाजी धागे" में "प्रक्रियाओं" में सही किया। मेरी गलती।
 – 
Jesvin Jose
28 सितंबर 2011, 10:27