2010-01-12 9 views
41
import subprocess 

def my_function(x): 
    return x + 100 

output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments 
print output 
#desired output: 101 

मुझे अलग स्क्रिप्ट का उपयोग करके उपप्रोसेसेस खोलने पर केवल दस्तावेज़ मिला है। क्या कोई फंक्शन ऑब्जेक्ट को पास करने या फ़ंक्शन कोड को पास करने का एक आसान तरीका कैसे जानता है?क्या थ्रेडिंग या अलग फ़ाइल/स्क्रिप्ट लिखने के बिना एक उपप्रोसेसर में फ़ंक्शन चलाने के लिए संभव है।

+1

मेरा मानना ​​है कि आप [मल्टीप्रोसेसिंग] (http://docs.python.org/3.1/library/multiprocessing.html) मॉड्यूल की तलाश में हैं। –

उत्तर

65

मुझे लगता है कि आप और अधिक बहु मॉड्यूल की तरह कुछ के लिए देख रहे:

http://docs.python.org/library/multiprocessing.html#the-process-class

उपप्रक्रिया मॉड्यूल स्पॉन प्रक्रियाओं के लिए है और उनके इनपुट/आउटपुट के साथ काम करने - कार्यों को चलाने के लिए नहीं।

from multiprocessing import Process, Queue 

def my_function(q, x): 
    q.put(x + 100) 

if __name__ == '__main__': 
    queue = Queue() 
    p = Process(target=my_function, args=(queue, 1)) 
    p.start() 
    p.join() # this blocks until the process terminates 
    result = queue.get() 
    print result 
+13

आप 'प्रोसेसिफाइ' सजावट को शॉर्टकट के रूप में उपयोग कर सकते हैं: https://gist.github.com/2311116 – schlamar

+1

मुझे लगता है कि यह क्लोन पाइथन दुभाषिया और इसके सभी पर्यावरण उपप्रजाय के लिए है? – Jens

+0

यहां प्रक्रिया की एक कांटा है जो पायथन 3 में काम करती है और जेनरेटर फ़ंक्शंस का समर्थन करती है। https://gist.github.com/stuaxo/889db016e51264581b50 –

14

आप मानक यूनिक्स fork सिस्टम कॉल का उपयोग कर सकते os.fork() के रूप में:

यहाँ अपने कोड का एक multiprocessing संस्करण है। fork() एक ही स्क्रिप्ट चलने के साथ, एक नई प्रक्रिया तैयार करेगा। नई प्रक्रिया में, यह 0 वापस आ जाएगा, जबकि पुरानी प्रक्रिया में यह नई प्रक्रिया की प्रक्रिया आईडी वापस कर देगा।

child_pid = os.fork() 
if child_pid == 0: 
    print "New proc" 
else: 
    print "Old proc" 

एक उच्च स्तर पुस्तकालय के लिए, कि वहाँ multiprocessing मॉड्यूल है, बहु समर्थन है कि कई प्रक्रियाओं का उपयोग कर के लिए एक पोर्टेबल अमूर्त प्रदान करता है प्रदान करता है। आईबीएम डेवलपर वर्क्स, Multiprocessing with Python पर एक लेख है, दोनों तकनीकों के लिए एक संक्षिप्त परिचय के साथ।

+0

मैं उत्सुक हूँ; डाउनवोट क्यों? क्या मेरे जवाब में कुछ गलत है? –

+0

मल्टीप्रोसेसिंग फोर्क() के आसपास सिर्फ एक उच्च स्तरीय रैपर नहीं है, यह एक मल्टीप्लाफ्फ़्ट मल्टीप्रोसेसिंग टूलकिट है (जो यूनिक्स पर कांटा का उपयोग करता है)। जो महत्वपूर्ण है, क्योंकि इसका मतलब है कि यह विंडोज़ कहता है, जबकि कांटा() नहीं करता है। संपादित करें: और यह डाउनवोट का कारण था, हालांकि मैंने बाद में फैसला किया कि शायद यह इसके लायक नहीं था। हालांकि, इसे वापस लेने में बहुत देर हो चुकी है। संपादित 2: या बल्कि, कांटा() को सुझाव दिया जा रहा है जब यह क्रॉस-प्लेटफॉर्म नहीं है। –

+1

@ डेविन, यदि आप चाहें तो आप हमेशा एक डाउनवोट वापस ले सकते हैं। –

3

ब्रायन मॅकेना की बहु के बारे में ऊपर पोस्ट वास्तव में उपयोगी है, लेकिन अगर आप थ्रेडेड मार्ग नीचे जाना चाहता था (प्रक्रिया-आधारित के खिलाफ), इस उदाहरण आप कार्य आरंभ कर देगा:

import threading 
import time 

def blocker(): 
    while True: 
     print "Oh, sorry, am I in the way?" 
     time.sleep(1) 

t = threading.Thread(name='child procs', target=blocker) 
t.start() 

# Prove that we passed through the blocking call 
print "No, that's okay" 

तुम भी उपयोग कर सकते हैं setDaemon(True) तुरंत थ्रेड पृष्ठभूमि के लिए सुविधा।

संबंधित मुद्दे

 संबंधित मुद्दे