并发:任务数多于CPU核数时
并行:任务数小于CPU核数时
线程:
使用threading模块使用线程
import threading
线程名 = threading.Thread(target = 函数名)
线程名.start()
主线程会等待所有子线程结束后才结束
如果需求时让主线程不等待某个子线程结束就立即结束,
解决方法是主线程守护
线程名.setDaemon(True)
例:
import threading, time def work(num): for i in range(num): print("work...") time.sleep(0.1) if __name__ == '__main__': work_thread = threading.Thread(target=work, args=(10,)) # 需求:不管子线程的任务是否执行完成 只有主线程的任务执行完程序就结束 # 解决方案:子线程名.setDaemon(True) work_thread.setDaemon(True) work_thread.start() print("测试")
线程传参的两种方法:
1.args
线程名 = threading.Thread(target = 函数名, args =(变量1,变量2...))
2.kwargs
线程名 = threading.Thread(target = 函数名, kwargs = {"变量名1":实参1,"变量名2":实参2})
查看当前线程
threading.current_thead()
查看运行的线程列表
threading.enumerate()
查看程序中有几个线程在工作
1. len(threading.enumerate())
2. threading.active_count()
多线程全局变量问题点:资源争夺问题
import threading num = 0 def work1(a): global num for i in range(1000000): num += 1 print("work1:", num) def work2(a): global num for i in range(1000000): num += 1 print("work2:", num) if __name__ == '__main__': work1_thread = threading.Thread(target=work1) work2_thread = threading.Thread(target=work2) work1_thread.start() work2_thread.start()
结果:
work2: 1193318
work1: 1230812
原因:work1大于1000000是因为累加时work2也会进行累加
work2小于2000000是因为在累加时work1和work2有可能返回同一个值
解决方案:线程同步
先执行的线程名.join()
代码:
import threading num = 0 def work1(): global num for i in range(1000000): num += 1 print("work1:", num) def work2(): global num for i in range(1000000): num += 1 print("work2:", num) if __name__ == '__main__': work1_thread = threading.Thread(target=work1) work2_thread = threading.Thread(target=work2) work1_thread.start() work1_thread.join() work2_thread.start()
自定义线程:
线程默认只能执行一个任务,自定义线程就是将多个函数用一个函数调用,线程只完成这一个函数就完成了多个任务。