1.1 什么是多线程?
多线程 Threading 是一种让程序拥有分身效果. 能同时处理多件事情. 一般的程序只能从上到下一行行执行代码, 不过 多线程 (Threading) 就能打破这种限制. 让你的程序鲜活起来.
1.2 添加多线程
import threadingdef thread_job():print("我是被添加的线程, 名称是: %s"% threading.current_thread())def main():added_thread = threading.Thread(target=thread_job) # 添加线程(定义线程)added_thread.start() # 启动线程print(threading.active_count()) # 查看当前可运行几个线程!print(threading.enumerate()) # 查看当前运行了那几个线程? MainThread 表示主进程, Thread 表示扩展的进程print(threading.current_thread()) # 查看当前运行的线程是那个?if __name__ == '__main__':main()
1.3 join() 功能
join()的功能 等待该线程结束
# 多线程import threadingimport timedef thread_job():print(f"T1 start\n")for i in range(10):time.sleep(0.1)print(f"T1 finish\n")def T2_job():print(f"T2 start\n")print(f"T2 finish\n")def main():# print(threading.active_count()) # 查看当前可运行几个线程!# print(threading.enumerate()) # 查看当前运行了那几个线程? MainThread 表示主进程, Thread 表示扩展的进程# print(threading.current_thread()) # 查看当前运行的线程是那个?added_thread = threading.Thread(target=thread_job, name="T1")thread2 = threading.Thread(target=T2_job, name="T2")added_thread.start()thread2.start()added_thread.join() # 等待这个线程结束thread2.join() # 等待这个线程结束print("all done\n")"""有时候 t2 的线程比 t1 的线程 先结束, 因为t2的线程做的任务比较简单"""if __name__ == '__main__':main()
1.4 存储进程结果 Queue
# 多线程 queue"""问题1: 在多线程当中,它是不能返回出来一个值的, 那么怎么解决?使用 模块 queue 和大写的 Queue"""import threadingimport timefrom queue import Queuedef job(l,q):# 对每一个列表的值进行 2次方计算for i in range(len(l)):l[i] = l[i]**2q.put(l)def multithreading():q = Queue()threads = []data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]for i in range(4):t = threading.Thread(target=job, args=(data[i],q))t.start()# 把启动的线程 都加入到列表中threads.append(t)# 批量 等待线程结束, 结束之后,会把每个线程的返回数据 保存在q里for thread in threads:thread.join()results = [] # 定义1个空的变量用来保存 多线程(每个线程返回的值)for _ in range(4):results.append(q.get()) # 取出每个线程的值print(results)if __name__ == '__main__':multithreading()
打印: [[1, 4, 9], [9, 16, 25], [16, 16, 16], [25, 25, 25]]
1.5 GIL 不一定有效率
1.6 线程锁 Lock
如果不设置 线程锁, 则会打印的数据很乱
# 线程锁"""引用 lock = threading.Lock()加锁 lock.acquire()解锁 lock.release()"""import threadingdef job1():global A, locklock.acquire()for i in range(10):A += 1print("job1", A)lock.release()def job2():global A, locklock.acquire()for i in range(10):A += 10print("job2", A)lock.release()if __name__ == '__main__':lock = threading.Lock()A =0;t1 = threading.Thread(target=job1)t2 = threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()
