from multiprocessing import Process
import time
deftask(n):print("%s: start"% n)
time.sleep(2)print("%s: end"% n)if __name__ =="__main__":
p = Process(target=task, args=("aaa",))# 进程 p 设置为守护进程
p.daemon=True
p.start()print("main end")
示例 - 守护进程报活
from multiprocessing import Process
import time
deftask():# 正常函数, 每 1s 打印一次for i inrange(5):print("task %s"% i)
time.sleep(1)deftask_d():# 守护进程, 每0.5s 报活一次while1:print("主进程仍然存活..")
time.sleep(0.5)if __name__ =="__main__":# 开启子进程
p = Process(target=task)# 开启一个守护进程, 本例中, 守护进程会随主进程关闭而关闭
pd = Process(target=task2)# 守护进程的开启
pd.daemon =True
p.start()
pd.start()# 1. 写上 p.join(), main end 会等待 p 结束后再打印# 2. 不写 p.join(), main end 不会等待 p 结束后再打印# 所以 p.join 写不写取决于逻辑是否需要按顺序执行
p.join()print("main end")
进程锁 - 保证数据安全
from multiprocessing import Process,Lock
import json
import time
import random
import os
defsearch():# 模拟网络延迟
time.sleep(random.randint(1,3))# 模拟查找数据
dic = json.load(open("db.txt","r",encoding="utf-8"))print("%s 查看剩余票数%s"%(os.getpid(), dic["count"]))defget():# 模拟查找数据
dic = json.load(open("db.txt","r",encoding="utf-8"))# 判断如果有, 数量减一if dic["count"]>0:# 模拟后台操作数据库
dic["count"]-=1
json.dump(dic,open("db.txt","w",encoding="utf-8"))# 模拟网络延迟
time.sleep(random.randint(1,3))print("%s 购票成功"% os.getpid())else:print("购票失败")deftask(m):# 查找时, 因为并不对数据做修改, 所以不需要加锁
search()# 加锁, 因为会涉及到数据变化
m.acquire()
get()# 解锁
m.release()if __name__ =="__main__":# 用一把锁, 锁住公用数据
mutex = Lock()for i inrange(10):
p = Process(target=task, args=(mutex,))# 将锁作为参数传给子进程
p.start()