python 进程间通信效率_python之并发编程-进程之间的通信
互斥锁
进程之间数据不共享,但共享同一套文件系统,或同一个打印终端是没有问题的。但共享导致了竞争,若不加以控制就会造成错乱。如下:
from multiprocessing import Process
import time
import random
def task1():
print('task1开始打印')
time.sleep(random.randint(1,3))
print('task1打印完成')
def task2():
print('task2开始打印')
time.sleep(random.randint(1,3))
print('task2打印完成')
def task3():
print('task3开始打印')
time.sleep(random.randint(1,3))
print('task3打印完成')
if __name__ == '__main__':
p1 = Process(target=task1,)
p2 = Process(target=task2,)
p3 = Process(target=task3,)
p1.start()
p2.start()
p3.start()
# task1开始打印
# task2开始打印
# task3开始打印
# task1打印完成
# task3打印完成
# task2打印完成
使用加锁可以使并发变成串行,牺牲效率,避免竞争
from multiprocessing import Process
from multiprocessing import Lock
import time
import random
def task1(lock):
lock.acquire()
print('task1开始打印')
time.sleep(random.randint(1,3))
print('task1打印完成')
lock.release()
def task2(lock):
lock.acquire()
print('task2开始打印')
time.sleep(random.randint(1,3))
print('task2打印完成')
lock.release()
def task3(lock):
lock.acquire()
print('task3开始打印')
time.sleep(random.randint(1,3))
print('task3打印完成')
lock.release()
if __name__ == '__main__':
lock = Lock()
p1 = Process(target=task1,args=(lock,))
p2 = Process(target=task2,args=(lock,))
p3 = Process(target=task3,args=(lock,))
p1.start()
p2.start()
p3.start()
# task1开始打印
# task1打印完成
# task2开始打印
# task2打印完成
# task3开始打印
# task3打印完成
利用多进程抢票:
from multiprocessing import Process
from multiprocessing import Lock
import time
import random
import json
def search():
time.sleep(random.random())# 模拟读取数据网络延迟
with open('db.json',encoding='utf-8') as f:
dic = json.load(f)
print(f'剩余票数{dic["count"]}')
def get():
with open('db.json',encoding='utf-8') as f:
dic = json.load(f)
time.sleep(random.random())# 模拟读取数据网络延迟
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(random.random())# 模拟写数据网络延迟
with open('db.json',encoding='utf-8',mode='w') as f:
json.dump(dic,f)
print(f'{os.getpid()}用户购买成功')
else:
print('票没了')
def task(lock):
search()
lock.acquire()
get()
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(5):
p = Process(target=task,args=(lock,))
p.start()
# 剩余票数1
# 剩余票数1
# 14004用户购买成功
# 剩余票数0
# 剩余票数0
# 票没了
# 剩余票数0
# 票没了
# 票没了
# 票没了
虽然可以用文件共享数据实现进程间通信,但问题是:
效率低(共享数据居于文件,而文件是硬盘上的数据)
需要自己加锁处理,容易形成死锁、递归锁(注意一个进程只能使用一个锁)