क्या थ्रेडिंग या अलग फाइल / स्क्रिप्ट लिखे बिना सबप्रोसेस में फ़ंक्शन चलाना संभव है।


82
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
मेरा मानना ​​है कि आप मल्टीप्रोसेसिंग मॉड्यूल की तलाश कर रहे हैं ।
नोक्टिस स्काईटॉवर

जवाबों:


111

मुझे लगता है कि आप मल्टीप्रोसेसिंग मॉड्यूल की तरह कुछ और देख रहे हैं:

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

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

यहाँ multiprocessingआपके कोड का एक संस्करण है:

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

20
आप processifyडेकोरेटर को शॉर्टकट के रूप में उपयोग कर सकते हैं : gist.github.com/2311116
schlamar

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

1
यहां प्रक्रिया का एक कांटा है जो अजगर 3 में काम करता है और जनरेटर कार्यों का समर्थन करता है। gist.github.com/stuaxo/889db016e51264581b50
स्टुअर्ट एक्सॉन

4
ध्यान दें कि इस कोड में एक गतिरोध है यदि आप गैर-तुच्छ बड़े डेटा को कतार के माध्यम से पास कर रहे हैं - प्रक्रिया में शामिल होने से पहले हमेशा कतार (।), अन्यथा यह कतार में लिखने की कोशिश पर लटका रहेगा जबकि कुछ भी इसे नहीं पढ़ रहा है।
पेट्र बॉडीज़

@schlamar मैं पृष्ठभूमि में एक फ़ंक्शन चलाना चाहता हूं, लेकिन मेरे पास कुछ संसाधन सीमाएं हैं और मैं फ़ंक्शन को कई बार नहीं चला सकता हूं जो मैं चाहता हूं और फ़ंक्शन के अतिरिक्त निष्पादन को कतारबद्ध करना चाहता हूं। क्या आपके पास कोई विचार है कि मुझे यह कैसे करना चाहिए? मेरा सवाल यहाँ है । क्या आप कृपया मेरे प्रश्न पर एक नज़र डाल सकते हैं? कोई भी मदद बहुत अच्छी रहेगी!
अमीर

17

आप मानक यूनिक्स forkप्रणाली कॉल का उपयोग कर सकते हैं , जैसा कि os.fork()fork()एक नई प्रक्रिया बनाएगा, जिसमें एक ही स्क्रिप्ट चल रही होगी। नई प्रक्रिया में, यह 0 लौटाएगा, जबकि पुरानी प्रक्रिया में यह नई प्रक्रिया की प्रक्रिया आईडी लौटाएगा।

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

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


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

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

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

तब स्पष्ट करने के लिए संपादित किया गया। मैंने स्पष्ट रूप से उल्लेख किया है कि forkपोर्टेबल नहीं है; मैं आमतौर पर गैर-पोर्टेबल उत्तर के साथ-साथ यह भी जानकारी दूंगा कि वे गैर-पोर्टेबल हैं, और प्रश्नकर्ता को यह तय करने दें कि क्या यह उनके लिए पर्याप्त है। जैसा कि मैंने अपना उत्तर संपादित कर दिया है, आपको लगता है कि अगर मुझे लगता है कि मैंने इसे पर्याप्त रूप से सुधार लिया है, तो आपको हटा देना चाहिए; हालांकि कोई मुश्किल भावना नहीं है अगर आप नहीं करते हैं, तो मैं सिर्फ यह देखना चाहता हूं कि मैं क्या गलत हूं।
ब्रायन कैंपबेल

@ एलेक्स, नहीं, आप नहीं कर सकते। एक निश्चित समय बीतने के बाद, आप इसे वापस नहीं ले सकते, जब तक कि कोई संपादन नहीं होता है। इससे पहले कि मैं पुनर्विचार करता, इस प्रकार की बहुत सी अवधि बीत चुकी थी, इस प्रकार "बहुत देर हो गई" टिप्पणी। वैसे भी, जैसा कि मैंने कहा, मैंने फैसला किया था कि यह इसके लायक नहीं था, इसलिए यह चला गया है। मैं भी आपके कारणों की सराहना करता हूं और समझता हूं, और मुझे खुशी है कि इस तरह से कोई कठिन भावनाएं नहीं होंगी। : पी
डेविन जीनपिएरे

5

मल्टीक्रॉसिंग के बारे में ब्रायन मैककेना की उपरोक्त पोस्ट वास्तव में सहायक है, लेकिन यदि आप थ्रेडेड रूट (प्रक्रिया-आधारित के विपरीत) पर जाना चाहते हैं, तो यह उदाहरण आपको शुरू कर देगा:

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)थ्रेड को तुरंत बैकग्राउंड करने के लिए आप फीचर का भी इस्तेमाल कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.