多进程- 锁、信号量、事件
2018-12-08 本文已影响0人
冬至是条狗
multiprocessing
-
创建进程的两种方式
import multiprocessing import time def func(): while True: print("in func") time.sleep(1) p = multiprocessing.Process(target=func) # 后面可以跟args=(,)参数元祖 p.start()
-
无参数的类创建
import multiprocessing import time class Myprocessing(multiprocessing.Process): def run(self): time.sleep(1) print("in Myprocessing") p = Myprocessing() p.start()
-
有参数的类创建
import multiprocessing import time class Myprocessing(multiprocessing.Process): def __init__(self, args1, args2): super().__init__() self.args1 = args1 self.args2 = args2 def run(self): time.sleep(1) print("in Myprocessing") print(self.args1) print(self.args2) print(self.pid) p = Myprocessing(1, 2) p.start()
-
p.daemon = True # 用来开启守护进程,开启后,主进程执行完毕该子进程结束。
-
p.is_alive() # 判断子进程是否活着
-
p.terminate() # 用来结束一个子进程,结束后需要等待操作系统调度执行。并不会立即结束
进程锁
使用进程锁可以保证同一个数据只能被一个进程访问和修改,但每次使用完要记得释放锁
为了数据安全,在多进程修改数据库时使用锁,降效保证数据安全,而查看则不需要加锁
lock = multiprocessing.Lock() # 创建一个锁对象
lock.acquire() # 获得锁的使用权
lock.release() # 释放锁的使用权
信号量
可以理解为同一段代码同一时间的使用数量,需要在进程创建时将对象传入,使用时与进程锁类似
sem = multiprocessing.Semaphore(x) # x为控制的数量
事件
一个信号可以使所有的进程都进入阻塞状态,也可以使所有的进程接触阻塞。
事件被创建后默认为阻塞状态
e = multiprocessing.Event()
-
print(e.is_set()) # 查看当前状态
-
e.set() # 事件状态改为True
-
e.wait() # 如果事件状态为False 程序阻塞
-
e.clear() # 事件状态设置为 False
事件可以作为进程之间互相控制的开关,例程: 红绿灯
import multiprocessing
import time
import random
# 起一个进程控制红绿灯
class Light(multiprocessing.Process):
def __init__(self, e):
super().__init__()
self.e = e
def run(self):
while True:
print("绿灯亮了,可以走")
e.clear()
time.sleep(2)
print("红灯亮了,停")
e.set()
time.sleep(2)
def car(e):
while True:
if e.is_set():
e.wait()
print("车辆等待")
else:
print("车辆通过")
time.sleep(random.random())
if __name__ == '__main__':
e = multiprocessing.Event()
light_p = Light(e)
light_p.daemon = True
light_p.start()
e.set()
car(e)