目录
1.2信号量:一把锁配多把钥匙 from multiprocessing import Semaphore
二.事件 from multiprocessing import Event
三.进程间通信——队列(multiprocessing.Queue)
一.锁
我们实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题。
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。
进程锁: 也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。
os.getpid () Python中的method用于获取当前进程的进程ID
1.1加锁
第一种没有加锁:
import time,os
from multiprocessing import Process,Lock
def fun(lock,n):
# lock.acquire()
print("我是子进程:%s 进程🆔id为:%s"%(n,os.getpid()))
time.sleep(2)
print("回头科科:%s 进程🆔id为:%s"%(n,os.getpid()))
# lock.release()
if __name__ == "__main__":
lock = Lock()
for i in range(5):
p = Process(target=fun,args=(lock,i,))
p.start()
print("我是主进程")
第二种加锁:
代码:
import time,os
from multiprocessing import Process,Lock
def fun(lock,n):
lock.acquire()
print("我是子进程:%s 进程🆔id为:%s"%(n,os.getpid()))
time.sleep(2)
print("回头科科:%s 进程🆔id为:%s"%(n,os.getpid()))
lock.release()
if __name__ == "__main__":
lock = Lock()
for i in range(5):
p = Process(target=fun,args=(lock,i,))
p.start()
print("我是主进程")
使用加锁的形式实现了顺序的执行
1.2信号量:一把锁配多把钥匙 from multiprocessing import Semaphore
代码:
1.
from multiprocessing import Semaphore
l = Semaphore(3)
l.acquire()
print(1)
l.acquire()
print(2)
l.acquire()
print(3)
# l.release()
l.acquire()
print(4