使用process模块创建进程
from multiprocessing import Process
def f(name):
print('hello', name)
print('我是子进程')
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
time.sleep(1)
print('执行主进程的内容了')
- 在windows使用该模块需要在if name ==‘main’里面,不然会报错
- args=(‘bob’,) 传递参数时使用的,注意只有一个参数是要有逗号。p.start() 才使子进程开始运行
- 模块multiprocess中创建了子进程完,父进程会等所有子进程都运行完,才结束
- 正常创建子进程后主进程不会阻塞,但是可以使用代码p.join()会等到子进程结束后,再向下执行代码,p.join(10) 10代表超时时间,超过10秒就不等了,就等于程序把异步变成同步
- 多进程之间数据参数是完全隔离的,各自使用各自的,注意子进程里面不能使用input
进程锁
- 在编程中对某段代码加个锁,同一时间就只能单个进程可以执行这段代码,目的就是为了防止 一些硬盘IO时产生超买超卖的现象。多在共享存储时,数据库操作时
# 从模块中引入锁
from multiprocessing import Lock
# 创建一把锁
lock = Lock()
# 在需要加锁的函数参数中传入一个参数,lock,然后在函数体最上面加,就是拿钥匙进门
lock.acquire()
# 在函数最后加入lock.release,还钥匙
lock.release()
信号量
- 同一段代码同一时间只能限制一些人使用,进程锁限定只能一个人使用,信号量与其对应,可以限定多少个人使用
from multiprocessing import Semaphore
# 创建信号器数量(4把钥匙)为4
sema = Semaphore(4)
# 同进程锁,在需要限定使用的函数头加sema.acquire(),进程拿走一把钥匙
sema.acquire()
# 尾部加
sema.release()
事件
from multiprocessing import Event
# 创建一个事件
event = Event()
# 判断事件的状态,默认创建事件时候是阻塞的,就是false
event.is_set()
# wait方法是根据状态决定是否阻塞下面的代码
event.wait()
# 设置事件状态为true
event.set()
# 清除事件状态,改为默认
event.clear()
# 实例
inter-Process Community 进程间通信
- 队列Queue,先进先出
- queue.put() 把数据放入队列
- queue.get() 把数据从队列中取出
- queue.full() 判断队列是否满了
- queue.empty() 判断队列是否空了
from multiprocessing import Queue
queue = Queue
进程池
from multiprocessing import Pool
# 创建进程池,里面有5个进程
pool = Pool(5)
for temp in range(10):
# 异步创建任务用applay_async
pool.applay_async(func,args=(i,))
# 关闭进程池,表示不能在往进程池中添加进程
pool.close()
# 等待进程池中的所有进程执行完毕,必须在close()之后调用
pool.join()
- 进程池的效率明显高于单独一个一个创建进程,因为创建进程需要消耗大量的时间,而进程池是完成一个任务后,继续使用该进程执行下一个任务。进程池一样要写在if name == "main"底下