2010-05-25 116 views
93

我有一個腳本,我想要一個函數與另一個函數同時運行。在python中創建線程

示例代碼我已經看過:

import threading 


def MyThread (threading.thread): 

    doing something........ 

def MyThread2 (threading.thread): 

    doing something........ 

MyThread().start() 
MyThread2().start() 

我無法得到這個工作。我寧願使用線程函數而不是類來使用它。

感謝您的任何幫助。

這是工作腳本,感謝所有幫助。

class myClass(): 

    def help(self): 

     os.system('./ssh.py') 

    def nope(self): 
     a = [1,2,3,4,5,6,67,78] 
     for i in a: 
      print i 
      sleep(1) 


if __name__ == "__main__": 
    Yep = myClass() 
    thread = Thread(target = Yep.help) 
    thread2 = Thread(target = Yep.nope) 
    thread.start() 
    thread2.start() 
    thread.join() 
    print 'Finished' 

回答

178

你並不需要使用的Thread一個子類,使這項工作 - 看看簡單的例子我張貼下面來看看如何:

from threading import Thread 
from time import sleep 

def threaded_function(arg): 
    for i in range(arg): 
     print "running" 
     sleep(1) 


if __name__ == "__main__": 
    thread = Thread(target = threaded_function, args = (10,)) 
    thread.start() 
    thread.join() 
    print "thread finished...exiting" 

在這裏,我展示瞭如何使用線程模塊創建一個調用普通函數作爲其目標的線程。你可以看到我可以在線程構造函數中傳遞我需要的任何參數。

+0

我試過這個。我在上面添加了腳本。你能告訴我如何獲得與第一個函數並行的第二個函數。謝謝 – chrissygormley 2010-05-25 15:35:45

+2

@chrissygormley:join()阻塞,直到第一個線程結束。 – FogleBird 2010-05-25 15:40:53

+3

@chrissygormley:如前所述,加入塊直到你加入的線程完成,所以在你的情況下,用第二個函數開始第二個線程作爲並行運行兩個函數的目標,然後可以選擇加入其中的一個如果你只是想等到他們完成。 – jkp 2010-05-25 15:45:32

1

你重寫了run()方法嗎?如果您忽略了__init__,您是否確定要撥打基地threading.Thread.__init__()

啓動兩個線程之後,主線程是否會無限期地繼續工作/阻塞/加入子線程,以便主線程執行不會在子線程完成其任務之前結束?

最後,你是否得到任何未處理的異常?

+0

有沒有未處理的異常和主線程應運行30分鐘。我沒有覆蓋'__init__'。 run()需要嗎?謝謝 – chrissygormley 2010-05-25 15:22:55

+0

我剛剛意識到你的例子是'def MyThread(threading.thread)'...我認爲那些是類定義。如果你打算繼承threading.thread並用'target = None'初始化線程對象或者省略'target' arg,那麼需要run()的實現。否則,如果你只是想在另一個線程中運行一個簡單的任務,請參閱jkp的答案。 – 2010-05-25 15:26:51

1

您可以使用Thread構造函數中的參數target直接傳入一個被調用的函數,而不是run

28

有幾個問題與您的代碼:

def MyThread (threading.thread): 
  • 你不能用一個函數子類;只有一類
  • 如果你要使用一個子類,你會希望threading.Thread,不threading.thread

如果你真的想只用函數來做到這一點,你有兩個選擇:

隨着線程:

import threading 
def MyThread1(): 
    pass 
def MyThread2(): 
    pass 

t1 = threading.Thread(target=MyThread1, args=[]) 
t2 = threading.Thread(target=MyThread2, args=[]) 
t1.start() 
t2.start() 

螺紋:

import thread 
def MyThread1(): 
    pass 
def MyThread2(): 
    pass 

thread.start_new_thread(MyThread1,()) 
thread.start_new_thread(MyThread2,()) 

Doc for thread.start_new_thread

+2

第二個參數必須是一個**元組**,用於['thread.start_new_thread(function,args [,kwargs])'](https://docs.python.org/2/library/thread.html#thread。 start_new_thread) – venkatvb 2015-06-09 07:00:53

6

我試着添加另一個join(),它似乎工作。這裏是代碼

from threading import Thread 
from time import sleep 

def function01(arg,name): 
for i in range(arg): 
    print(name,'i---->',i,'\n') 
    print (name,"arg---->",arg,'\n') 
    sleep(1) 


def test01(): 
    thread1 = Thread(target = function01, args = (10,'thread1',)) 
    thread1.start() 
    thread2 = Thread(target = function01, args = (10,'thread2',)) 
    thread2.start() 
    thread1.join() 
    thread2.join() 
    print ("thread finished...exiting") 



test01()