进程同步技术
- 在需要协同工作完成大型任务时,多个进程间同步非常重要。
- 进程同步方法与线程同步方法类似,代码稍微修改一些即可。
- 注意:进程同步和线程同步中Event对象的is_set()方法和isSet()方法名不同,功能相同
Lock对象
- 互斥锁 Lock 对象 是比较低级的同步原语,当被锁定以后不属于特定的线程。
- 一个锁有两种状态:locked 和 unlocked。
import multiprocessing
def text(name,m):
# 上锁
m.acquire()
print(name + ":Ok!")
# 释放解锁
m.release()
if __name__ == "__main__":
print("---start---")
# 创建Lock对象
mutex = multiprocessing.Lock()
jobs = []
for i in range(5):
j = multiprocessing.Process(target=text, args=(str(i),mutex))
jobs.append(j)
j.start()
for j in jobs:
j.join()
print("--- end ---")
运行结果:
---start---
0:Ok!
1:Ok!
2:Ok!
3:Ok!
4:Ok!
--- end ---
Event对象
- **Event 对象是一种简单的线程通信技术,一个线程设置Event对象,另一个线程等待Event对象。
- 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False。wait()方法阻塞,直到标志为True。该标志初始为False。
- Event 对象中的方法如下:
- is_set()方法:
- 注意:线程同步技术中的该方法为isSet()
- 当且仅当内部标志为True时返回True
- set()方法:
- 将内部标志设置为True。所有等待它成为True的线程都被唤醒。当标志保持在True的状态时,线程调用wait()是不会阻塞的。
- clear()方法:
- 将内部标志重置为False。随后,调用wait()的线程将阻塞,直到另一个线程调用set()将内部标志重新设置为True。
- wait(timeout=None)方法:
- 阻塞直到内部标志为真。如果内部标志在wait()方法调用时为True,则立即返回。否则,则阻塞,直到另一个线程调用set()将标志设置为True,或发生超时。
- 该方法总是返回True,除非设置了timeout并发生超时。
import multiprocessing
def text(name, e):
if e.is_set():
e.wait()
print(name + ":Ok!")
e.clear()
else:
print(name + ":NO!")
e.set()
if __name__ == "__main__":
print("---start---")
# 创建Event对象
event = multiprocessing.Event()
# 将event对象的内部标志设置为True
event.set()
jobs = []
for i in range(5):
multiprocessing.Process(target=text, args=(str(i), event)).start()