八周三次课(12月13日)
15.1 多线程实例
Python中提供了threading模块来对多线程的操作,
多线程实例
线程是应用程序中工作的最小单元。
多线程是现实有两种方式:
方法一:将要执行的方法作为参数传给Thread的构造方法(和多进程类似)
t = threading.Thread(target=action, args=(i,))
方法二:从Thread继承,并重写run()
看源码:
P = threading.Thread
p.start() _start_new_thread(self.__bootstrap, ()) self.__bootstrap_inner()
self.run()
try:
if self.__target:
self.__target(*self.__args, **self.__kwargs)
所以如果重写了run,就直接调用run的函数了,如果run没有重新,就调用target函数。
示例
import threading
def worker(n):
print("start worker{0}".format(n))
class MyThread(threading.Thread):
def __init__(self,args):
super(MyThread,self).__init__()
self.args = args
def run(self):
print("start MyThread{0}".format(self.args))
if __name__ == "__main__":
for i in range(1,6):
t1 = threading.Thread(target=worker,args=(i,))
t1.start()
t1.join()
for x in range(6,11):
t2 = MyThread(x)
t2.start()
t2.join()
结果
start worker1
start worker2
start worker3
start worker4
start worker5
start MyThread6
start MyThread7
start MyThread8
start MyThread9
start MyThread10
15.2 多线程锁
通过threading.Lock()来创建锁,函数在执行的只有先要获得锁,左后执行完以后要释放锁:
with lock:
lock.acquire()
lock.release()
示例
import threading
import time
def worker(name,lock):
with lock:
print("start worker {0}".format(name))
time.sleep(2)
print("end worker {0}".format(name))
if __name__ == "__main__":
lock = threading.Lock()
t1 = threading.Thread(target=worker,args=("worker1",lock))
t2 = threading.Thread(target=worker,args=("worker2",lock))
t1 .start()
t2 .start()
print("main end")