1、导入线程模块:import threading
2、创建子线程:hello_thread = threading.Thread(target=hello) 【hello是任务名,指向函数hello()的内存地址,切记不能将任务名写为hello();T 为大写】
3、启动子线程:hello_thread.start()
4、子线程执行带参任务时:(1) args=(参数,) 表示以元组的方式给执行任务传参
(2) kwargs={键值对} 表示以字典方式给执行任务传参
5、线程注意点:(1) 进程之间能共享全局变量
(2) 主线程会等待所有的子线程执行结束再结束
(3) 线程之间执行是无序的
(4) 线程之间共享全局变量数据出现错误问题
6、主线程结束时就结束子线程的方法:(1) 守护主线程方法一:hello_thread = threading.Thread(target=hello, daemon=True)
(2) 守护主线程方法二:hello_thread.setDaemon(True)
7、共享全局变量数据错误的解决办法:(1) 线程1.join() 【等待线程1执行完成后再执行线程2】
(2) 使用互斥锁:lock = threading.Lock() #创建互斥锁【创建位置在程序开头处】【只针对上锁的线程会有执行的先后顺序,没有lock.acquire()的线程,启动即执行不用等待】
lock.acquire() #操作共享数据之前,要上锁【线程执行任务的开始处上锁,先抢到锁的线程先执行】
lock.release() #共享数据操作完成以后,需要释放锁【在线程执行任务的结束处释放锁,一定要注意位置,避免未释放锁造成死锁情况】
#【lock.acquire()相当于对线程进行上锁,同一时刻只有一把钥匙可以让线程执行,所有上锁的线程只有等待抢到钥匙才能执行】 |
|