2009-02-13 8 views
38

मैं एक ऐसे उपयोगकर्ता के लिए एक छोटा डैशबोर्ड बना रहा हूं जो उसे विशिष्ट नौकरियों को चलाने की अनुमति देगा। मैं Django का उपयोग कर रहा हूं, इसलिए मैं चाहता हूं कि वह नौकरी शुरू करने के लिए एक लिंक पर क्लिक करने में सक्षम हो और फिर पृष्ठ को उस संदेश के साथ वापस लौटाए जो नौकरी चल रहा है। नौकरी के परिणाम बाद में उन्हें ईमेल किया जाएगा।मैं पाइथन में इसे समाप्त करने के इंतजार किए बिना एक और स्क्रिप्ट कैसे चला सकता हूं?

मेरा मानना ​​है कि मुझे subprocess.Popen का उपयोग करना चाहिए, लेकिन मुझे इसके बारे में निश्चित नहीं है। तो स्यूडोकोड में, यहाँ मुझे क्या करना चाहते हैं:

if job == 1: 
    run script in background: /path/to/script.py 
    return 'Job is running' 
+0

** के संभावित डुप्लिकेट [पायथन में पृष्ठभूमि प्रक्रिया शुरू करना] (http://stackoverflow.com/questions/1196074/starting-a-background-process-in-python) ** और ** [कैसे करें पृष्ठभूमि में बाहरी स्क्रिप्ट लॉन्च करें और चलाएं?] (http://stackoverflow.com/questions/1605520/how-to-launch-and-run-external-script-in-background) ** – olibre

उत्तर

61
p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
            stdout=subprocess.PIPE, 
            stderr=subprocess.STDOUT) 

कि पृष्ठभूमि में उपप्रक्रिया शुरू कर देंगे। आपकी स्क्रिप्ट सामान्य रूप से चलती रहेगी।

प्रलेखन here पढ़ें।

+0

nosklo: धन्यवाद। मैं स्क्रिप्ट के लिए तर्कों में कैसे पास करूं? – sheats

+3

सूची में अतिरिक्त तत्व पहले तर्क के रूप में पारित हुए। लिंक्ड दस्तावेज उपयोगी है, और किसी कारण से जुड़ा हुआ है। –

+0

एक गैर-विंडोज वातावरण में, आप os.fork को भी देख सकते हैं –

3

subprocess.Popen वास्तव में आप जो खोज रहे हैं वह है।

1

यद्यपि यदि आप पाते हैं कि आप उपप्रोसेस और माता-पिता के बीच जानकारी का एक समूह संचार करना शुरू करना चाहते हैं, तो आप ट्रिस्ट जैसे थ्रेड, या आरपीसी फ्रेमवर्क पर विचार करना चाहेंगे।

लेकिन अधिकतर संभावना है कि वे आपके आवेदन के लिए बहुत भारी हैं।

6

संदेश कतार के माध्यम से इसे चलाने के लिए निश्चित रूप से जाने का तरीका निश्चित रूप से है यदि आप लंबी अवधि के स्केलिंग के बारे में सोच रहे हैं। कतार में एक संदेश भेजें जो लगातार पृष्ठभूमि में चल रहा है, और विभिन्न प्रकार के संदेशों से निपटने के लिए नौकरी हैंडलर लिखता हूं।

चूंकि आप Django का उपयोग कर रहे हैं, मुझे लगता है कि Beanstalkd एक बहुत अच्छा फिट है। Here's विषय पर एक बहुत अच्छा ट्यूटोरियल। उस लेख में पहली टिप्पणी में कुछ अच्छी युक्तियां भी हैं।

व्यक्तिगत रूप से मैंने एर्लांग में लिखे गए एक कस्टम इन-मेमोरी कतार सर्वर के साथ रोल किया है, जिसमें सी में लिखा पायथन-बाइंडिंग है। redis ऐसा लगता है कि यह भविष्य में कतार/संदेश-आवश्यकताओं के लिए एक महान दावेदार के रूप में काम कर सकता है। उम्मीद है की यह मदद करेगा!

+3

अजवाइन (http://pypi.python.org/pypi/celery) इसके लिए भी एक अच्छा मैच होगा।यह RabbitMQ का उपयोग करता है (संदेश दृढ़ता के लिए, गाजर के लिए एक बीनस्टॉकड बैकएंड निश्चित रूप से संभव है यदि किसी के पास समय हो) बीनस्टॉक ट्यूटोरियल केवल समस्याओं में से एक को हल करता है, संदेश भेजता है, लेकिन वास्तव में पाठक के लिए अभ्यास के रूप में कार्य को निष्पादित करता है। – asksol