使用进程池创建多进程
from multiprocessing import Pool import os import time def work(times): print('这是第{}次的任务,由进程编号{}的进程来完成'.format(times,os.getpid())) time.sleep(3) # 模拟耗时任务 if __name__ == '__main__': pool = Pool(3) # 允许3个进程 for i in range(0,10): # range()遵循c的编写风格,所以左开右闭 # pool.apply_async(work,args=(i,)) # 异步的,非阻塞式(asynchronous) pool.apply(work,args=(i,)) # 同步,阻塞式(synchronous) pool.close() # 关闭进程池 pool.join() # 等待子进程结束,主进程才结束,放在close后面多线程改变全局变量
import threading import time import os num = 0 def func1(): print('当前写入线程正在运行',os.getpid()) global num for i in range(10): num += 1 def func2(): global num print('当前线程读取的全局变量是',num,os.getpid()) if __name__ == '__main__': t1 = threading.Thread(target=func1) # 创建线程1 t1.start() # 启动线程1 t1.join() # 让线程1顺利执行完毕 time.sleep(1) # 让读操作顺利进行,这个间隔先用来完成写操作 t2 = threading.Thread(target=func2) # 创建线程1 t2.start() # 启动线程2 t2.join() # 让线程1顺利执行完毕 print(num) # 当前写入线程正在运行 11798 # 当前线程读取的全局变量是 10 11798 # 10 # 经过写操作改变了num值,可以看到,在线程2读到的num值为10,主进程中最后读到的num值也为10 # 结论:多线程之间可以共享全局变量不同线程争抢资源引发全局变量不满足预期值的问题
各个线程占用资源却又想要获得对方的资源,但又不释放自己占有的资源,就是死锁。
通过队列(第三方平台)来实现双方的通信,提升了效率,使得当资源短缺时,经过等待可以让程序继续进行,不会出现死锁。
import threading from queue import Queue # 生产者的线程类 class Producer(threading.Thread): def run(self): global que while True: if que.qsize() < 10: # qsize()队列的大小<10 que.put('生产数据') # 往队列放入一个数据 # 消费者的线程类 class Consumer(threading.Thread): def run(self): global que while True: if que.qsize() > 0: print(self.name,'消费数据',que.get()) # 从队列取出一个数据 if __name__ == '__main__': # TODO 创建队列 que = Queue() # TODO 创建一个线程代表生产者 p = Producer() # TODO 启动生产者 p.start() # TODO 创建一个线程代表消费者 c = Consumer() # TODO 启动消费者 c.start()