进程对象通信 守护 互斥锁

发布时间 2023-10-30 21:17:07作者: 朱饱饱

进程对象通信 守护 互斥锁
查看当前进程号:
from multiprocessing import Process,current_process(导入进程和当前进程)
import time
import os


def task:
print ('%s is running'%current_process().pid)(查看当前进程的进程号)
time.sleep(3)


if __name__=='__main__':
p=Process (target=task)因为不需要传值所以就不写后面的
p.start()
print (主)

守护进程:
from multiprocessing import Process
import time


def task(name):
print('%s总管正在活着',%name)
time.sleep(3)
print ('%s总管正在死亡',%name)


if __name__==__main__:
p=Process (target=task,args='egon',))
p.daemon=True将进程设置为守护进程,皇帝死 太监跟着死,这句要放在start前面
p.start()
print ('皇帝寿终正寝')

互斥锁:不懂 Lock
多个进程操作同一份数据时,会出现数据错乱的问题,针对上述问题,解决方式就是加锁处理,将并发变成串行,牺牲了效率但是保证数据的安全
抢票功能:
from multiprocessing import Process,Lock
impirt time
import json 储存和交换文本信息会将json格式字符串转换为Python对象
import random 随机模块
1.查票
def search(i): 定义一个票
with open('data','r',encodinf='utf–8')as f:
文件操作读取票数r是文本模式只读,如果用rb是转为二进制会更麻烦
dic=json.load() 是读文件,这里不是直接操作数据,loads是直接传数据类型
print('用户%s查询余票:%s%(i,dic.get('tick_num))) 字典取值不要用[ ]的形式,推荐使用get,写的代码不能报错
买票:1.先查票再点击进去购买,点进去也无法保证一定有票,所以会再次查询票2.买票付款后才算购票成功
def buy(i): 先查票
with open('data','r',encoding='utf–8')as f:
dic=json.load(f)
查票时也有网络延迟,但是延迟时间不固定所以需要导入一个随机模块来模仿:
time.sleep(random(1,3)) 随机延迟1-3秒
判断是否有票
if dic.get('ticket_num')>0:
dic['ticket_num']-=1 修改数据库 买票
with open('data','w',encoding='utf–8')as f:写入数据库
json.dump(dic,f) 把字典写入文件中
print('用户%s买票成功'%i)
else:
print(用户%s买票失败%i)
结合下来:
def run(i,mutex): 接收他
search(i) 查票
给买票环节加锁:
mutex.acquire()抢锁
buy(i)
if__name__=='__main__':
在主进程中设置一把锁 让所有的子进程都来抢,谁抢到谁先买票
mutex=Lock () mutex是变量名 一把锁的意思
for i in range(1,11):开多个进程,顾头不顾尾
p=Process (target=task,args=('i',mutex))把锁传给子进程
p.start()

文件data:
{"ticket_num":1}
行锁:例如一个表格,有个人在处理其中一行,其他人就只能等着
表锁:有人在处理这个表的时候,这个表其他人用不了,也只能等着
进程间通信:在两个进程间挖一条管道:subprocess

mutex=Lock () mutex是变量名 一把锁的意思
mutex.acquire()抢锁
mutex.release释放锁