2010-06-02 20 views
24

मैं एक ही समय में 2 फ़ंक्शन चलाने की कोशिश कर रहा हूं।एक ही समय में 2 फ़ंक्शन चलाएं

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

func1() 
func2() 

क्या कोई यह जानता है कि यह कैसे करें?

+0

[पाइथन: मैं पाइथन फ़ंक्शन को समानांतर में कैसे चला सकता हूं?] (Http://stackoverflow.com/questions/7207309/python-how-can-i-run-python-functions-in-parallel) – OrangeDog

उत्तर

46

यह करें:

import threading 
from threading import Thread 

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

if __name__ == '__main__': 
    Thread(target = func1).start() 
    Thread(target = func2).start() 
+12

वह जानना चाहेंगे कि ग्लोबल इंटरप्रेटर लॉक की वजह से वे एक ही समय में निष्पादित नहीं होंगे, भले ही मशीन में प्रश्न एकाधिक CPUs हों। http://wiki.python.org/moin/GlobalInterpreterLock –

+0

@joaquin - आपका अधिकार, क्षमा करें कॉपी और पेस्ट के बाद फ़ंक्शन निष्कर्ष निकालना भूल गया। – chrissygormley

+0

यह मेरे सिस्टम फोर्कबॉम्ब। – KI4JGT

9

The answer about threading अच्छा है, लेकिन आप थोड़ा अधिक है कि आप क्या करना चाहते हैं के बारे में विशिष्ट होने की जरूरत है।

आप दो कार्य है कि दोनों सीपीयू का एक बहुत, सूत्रण का उपयोग करें (CPython में) शायद आप कहीं नहीं मिल जाएगा। तो आप multiprocessing module पर एक नज़र डालना चाहते हैं या संभवतः आप ज्योथन/आयरनपीथन का उपयोग करना चाहेंगे।

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

अधिक जानकारी के बिना, यह एक अच्छा जवाब के साथ आने के लिए आसान नहीं है।

5

विधि एक ही समय में दो कार्य
रन threading मॉड्यूल (इस सवाल का जवाब another में वर्णित) का उपयोग कर काम करने के लिए प्रकट होता है, लेकिन वास्तव में के बीच एक छोटे से अधिक विलंबित होती है, के रूप में
Official Python Documentation में कहा गया है। इसके बजाय प्रयास करने का एक बेहतर समाधान multiprocessing module का उपयोग कर रहा है।

इसके अलावा, वहाँ कुछ अन्य उपयोगी अजगर मॉड्यूल है कि अतुल्यकालिक निष्पादन (एक ही समय में दो कोड) के लिए इस्तेमाल किया जा सकता है। चुनने के लिए सबसे अच्छा कौन सा है, इस बारे में कुछ जानकारी के लिए, https://stackoverflow.com/q/2629680/3787376 पर स्टैक ओवरफ़्लो प्रश्न देखें)। आधिकारिक अजगर प्रलेखन से

उद्धरण के बारे में threading module काम नहीं कर रहा:

CPython कार्यान्वयन विस्तार: CPython में, वैश्विक दुभाषिया लॉक की वजह से है, केवल एक धागा अजगर कोड निष्पादित कर सकते हैं एक ही बार में (यहां तक ​​कि हालांकि कुछ प्रदर्शन-उन्मुख पुस्तकालय इस सीमा को पार कर सकते हैं)। आप का बेहतर उपयोग करने के लिए आपके आवेदन चाहते हैं मल्टी कोर मशीनों के कम्प्यूटेशनल संसाधनों, आप उपयोग बहु या concurrent.futures.ProcessPoolExecutor सलाह दी जाती है। हालांकि, यदि आप एकाधिक I/O-bound कार्यों को एक साथ चलाने के लिए चाहते हैं तो थ्रेडिंग अभी भी एक उपयुक्त मॉडल है।


threading module के बारे में किसी अन्य उपयोगकर्ता से A comment:

वह पता चला है कि वैश्विक दुभाषिया लॉक की वजह से वे ठीक उसी समय भी मशीन अगर पर अमल नहीं होगा चाहते हो सकता है प्रश्न में एकाधिक CPUs हैं। wiki.python।org/मोइन/GlobalInterpreterLock

- जोनास Elfström Jun 2 '10 at 11:39

+0

मैं प्रत्येक प्रिंट() फ़ंक्शन के अंत में time.time() जोड़ता हूं और दूसरे उत्तर के कोड पर लूप को 9 गुना सीमित करता हूं। यहां मैं अपने टर्मिनल में देखता हूं: ('ए', 150 9 314761.857559) ('ए', 150 9314761.857664) ('ए', 150 9314761.85767) ('ए', 150 9314761.857675) ('ए', 150 9314761.85768) ('ए', 150 9314761.857685) ('ए', 150 9 314761.8576 9) ('ए', 150 9314761.8576 9 5) ('ए', 150 9314761.8576 99) ('बी', 150 9314761.8582238) ('बी', 150 9314761.858224) ('बी', 150 9314761.85822 9) ('बी', 150 9314761.858234) ('बी', 150 9 314761.858239) ('बी', 150 9314761.858244) ('बी', 150 9314761.85824 9) ('बी', 150 9314761.858253) ('बी', 150 9314761.858258) – weefwefwqg3

+0

मल्टीप्रोसेसिंग के साथ भी, यह वास्तव में समवर्ती संस्कार नहीं है? एक दूसरे के बाद चलता है। – weefwefwqg3

+1

मेरा पुराना उत्तर साफ़ किया गया जो बुरी तरह लिखा गया था (बेहतर सामग्री, इसे स्पष्ट और स्वरूपित/संरचित बेहतर बनाया गया)। – Edward

5

कार्यों एक साथ चलाए अगर मैं जाँच करने के लिए इस कोड को भाग गया:

#! /usr/bin/env python 
import threading 
from threading import Thread 
import time 

def time1(): 
    time.sleep(1) 
    print time.time() 

def time2(): 
    time.sleep(1) 
    print time.time() 

if __name__ == '__main__': 
    Thread(target = time1()).start() 
    Thread(target = time2()).start() 

यह यह क्या देता है:

1447425262.16 1447425263.16

मेरे लिए यह ऐसा लगता है कि दूसरे के बाद चलने वाले कार्यों की तरह ...?

+0

वे आपके प्रयोग की तरह दूसरे के बाद एक चलाते हैं, क्योंकि [आधिकारिक पायथन दस्तावेज कहता है] (https://docs.python.org/3.3/library/threading.html)। मैंने इस उद्धरण को उसी प्रश्न पृष्ठ पर भी शामिल किया ([मेरे उत्तर पर] (http://stackoverflow.com/a/33064260/3787376))। – Edward

+1

पार्टी के लिए देर हो चुकी है लेकिन: यह कारण भ्रमित प्रतीत हो सकता है कि 'थ्रेड' कन्स्ट्रक्टर में 'लक्ष्य' पैरामीटर फ़ंक्शन 'टाइम 1' और 'टाइम 2' नहीं है, बल्कि इसके बजाय 'time1()' और ' समय 2() '(नोट parantheses)। तो अनिवार्य रूप से, आप 'लक्ष्य = कोई नहीं' के साथ दो धागे चला रहे हैं। जब आप थ्रेड बनाते हैं तो दो फ़ंक्शन चलते हैं, न कि जब आप उन्हें प्रारंभ करते हैं। उम्मीद है कि किसी भी भ्रम को साफ करता है। –

+0

यह मेरे लिए अलग-अलग समय दिखाता है..यह एक ही समय में नहीं चल रहा है – lalithkumar

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