Python多线程实例教程(2)
这里target指向了一个具体的函数对象,而args传入了该方法调用时所必须的参数。这里传入了一个随即的睡眠时间。其中thread.join表示要等待该线程终止,和java中的Thread.join(long millionseconds)作用一样,如果不指定具体的时间的话,将会一直等待下去。
第二种方法就是指定一个可调用的类实例,实际上与前面一种非常的接近。如下所示:
from time import ctime,sleep import threading; from random import choice class ThreadFunc(object): def __init__(self,func,args,name): self.func=func; self.args=args; self.name=name; def __call__(self): self.func(*self.args); def loop(number,sec): print "Thread ",number," begins and will sleep ",sec," at ",ctime(); sleep(sec); print "Thread ",number,"ends at ",ctime(); def main(): seconds=[2,4]; threads=[]; array=range(len(seconds)); for i in array : t=threading.Thread(target=ThreadFunc(loop,(i,choice(seconds)),loop.__name__)); threads.append(t); print "main Thread begins at ",ctime(); for t in threads : t.start(); for t in threads : t.join(); print "main Thread ends at ",ctime(); if __name__=="__main__" : main();
这里只是将target指向从一个函数对象变成了一个可调用的类实例。
重点推荐下第三种方式,用继承threading.Thread的方式来实现线程,有过Java多线程应用的朋友一定会对下面的例子非常熟悉。
from time import ctime,sleep import threading; from random import choice class MyThread(threading.Thread): def __init__(self,func,args,name): super(MyThread,self).__init__(); self.func=func; self.args=args; self.name=name; def run(self): self.result=self.func(*self.args); def getResult(self): return self.result; def loop(number,sec): print "Thread ",number," begins and will sleep ",sec," at ",ctime(); sleep(sec); print "Thread ",number,"ends at ",ctime(); def main(): seconds=[2,4]; threads=[]; array=range(len(seconds)); for i in array : t=MyThread(loop,(i,choice(seconds)),loop.__name__); threads.append(t); print "main Thread begins at ",ctime(); for t in threads : t.start(); for t in threads : t.join(); print "main Thread ends at ",ctime(); if __name__=="__main__" : main();
从上面可以看出MyThread继承了threading.Thread类,并在初始化方法中执行了必要的参数赋值。值得注意的是在Java类的继承中,如果不显示的指定调用父类的构造方法,那么默认将调用父类的无参构造方法。而在Python中,就不会主动去调用。所以这里需要显示的调用父类的初始化方法。
希望本文所述对大家的Python程序设计有所帮助。