1、多线程运行优点:
-
可以把占长时间的任务放到后台去处理
-
程序的运行速度可能加快
-
在一些等待的任务实现上,线程就比较有用。
【如用户输入、文件读写和网络收发数据等,在这种情况下可释放一些资源如内存占用等】
2.线程的特点
- 线程可以被抢占(中断)。
- 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) – 这就是线程的退让。
3.线程的使用方法
带参数:【看清args=(i,) ,其中i后面有个逗号】
t1 = threading.Thread(target=func, args=(i,))
t1.start()
不带参数:
t1 = threading.Thread(target=func)
t1.start()
join的用法:
t1.join
join的作用:
主线程(主程序)A中,创建了子线程B,并且在主线程A中调用了B.join()方法(或多个线程中的一个join()方法),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行.
4.下面看一个例子(新起的线程不阻塞主线程的执行,不使用join)
import time, threading
import datetime
def func(i):
print("-------begin func-------")
time.sleep(2)
print('i:%d, hello world!'% (i))
print("-------end func-------")
def main():
for i in range(5):
t1 = threading.Thread(target=func, args=(i,))
t1.start()
#######这里是调用########################
print("-------begin main-------")
main()
print("-------end main-------")
执行结果:
执行结果如下:
-
从例子中可以看出,代码的执行先后
【新起的线程func函数的执行代码没有阻塞主线程end main的执行】
5.优化一下(新起的线程全部执行完再执行主线程的代码,使用join)
import time, threading
import datetime
def func(i):
print("-------begin func-------")
time.sleep(2)
print('i:%d, hello world!'% (i))
print("-------end func-------")
def main():
threads=[]
for i in range(5):
t1 = threading.Thread(target=func, args=(i,))
t1.start()
threads.append(t1)
for i in threads:
i.join()
print("-------begin main-------")
main()
print("-------end main-------")
执行结果如下: