三种方法创建多线程
- 创建 Thread 的实例,传给它一个函数。
- 创建 Thread 的实例,传给它一个可调用的类实例。
- 派生 Thread 的子类,并创建子类的实例。
1、创建 Thread 的实例,传给它一个函数
上代码
import threading
from time import sleep,ctime
loops = [4,2]
def loop(nloop,nsec):
print('start loop',nloop,'at:',ctime())
sleep(nsec)
print('loop',nloop,'done at:',ctime())
def main():
print('starting at:',ctime())
threads = []
nloops = list(range(len(loops)))
for i in nloops:
t = threading.Thread(target=loop,
args=(i,loops[i]))
threads.append(t)
for i in nloops: #开始多线程
threads[i].start()
for i in nloops: #等待所有线程完成
threads[i].join()
print('all done at:',ctime())
if __name__ == '__main__':
main()
运行结果为:
starting at: Mon Aug 20 09:46:14 2018
start loop 0 at: Mon Aug 20 09:46:14 2018
start loop 1 at: Mon Aug 20 09:46:14 2018
loop 1 done at: Mon Aug 20 09:46:16 2018
loop 0 done at: Mon Aug 20 09:46:18 2018
all done at: Mon Aug 20 09:46:18 2018
2、创建 Thread 的实例,传给它一个可调用的类实例
import threading
from time import sleep,ctime
loops = [4,2]
class ThreadFunc(object):
def __init__(self,func,args,name=''):
self.name = name
self.func = func
self.args = args
def __call__(self):
self.func(*self.args)
def loop(nloop,nsec):
print('start loop',nloop,'at:',ctime())
sleep(nsec)
print('loop',nloop,'done at:',ctime())
def main():
print('starting at:',ctime())
threads = []
nloops = list(range(len(loops)))
for i in nloops:
t = threading.Thread(
target=ThreadFunc(loop,(i,loops[i]),
loop.__name__))
threads.append(t)
for i in nloops: #开始多线程
threads[i].start()
for i in nloops: #等待所有线程完成
threads[i].join()
print('all done at:',ctime())
if __name__ == '__main__':
main()
运行结果为:
starting at: Mon Aug 20 09:43:49 2018
start loop 0 at: Mon Aug 20 09:43:49 2018
start loop 1 at: Mon Aug 20 09:43:49 2018
loop 1 done at: Mon Aug 20 09:43:51 2018
loop 0 done at: Mon Aug 20 09:43:53 2018
all done at: Mon Aug 20 09:43:53 2018
3、派生 Thread 的子类,并创建子类的实例
import threading
from time import sleep,ctime
loops = (4,2)
class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
def run(self):
self.func(*self.args)
def loop(nloop,nsec):
print('start loop',nloop,'at:',ctime())
sleep(nsec)
print('loop',nloop,'done at:',ctime())
def main():
print('starting at:',ctime())
threads = []
nloops = list(range(len(loops)))
for i in nloops:
t = MyThread(loop,(i,loops[i]),loop.__name__)
threads.append(t)
for i in nloops: #开始多线程
threads[i].start()
for i in nloops: #等待所有线程完成
threads[i].join()
print('all done at:',ctime())
if __name__ == '__main__':
main()
运行结果为:
starting at: Mon Aug 20 09:52:43 2018
start loop 0 at: Mon Aug 20 09:52:43 2018
start loop 1 at: Mon Aug 20 09:52:43 2018
loop 1 done at: Mon Aug 20 09:52:45 2018
loop 0 done at: Mon Aug 20 09:52:47 2018
all done at: Mon Aug 20 09:52:47 2018