python并发编程之多进程(实践篇二)

守护进程

主进程创建守护进程

1)守护进程会在主进程代码执行结束后就终止

2)守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
复制代码

from multiprocessing import Process
import time
import random

class Run(Process):
def init(self,name):
self.name=name
super().init()
def run(self):
print(’%s is piaoing’ %self.name)
time.sleep(random.randrange(1,3))
print(’%s is piao end’ %self.name)

p=Run(‘anne’)
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print(‘主’)

复制代码
复制代码

#主进程代码运行完毕,守护进程就会结束
from multiprocessing import Process
from threading import Thread
import time
def foo():
print(123)
time.sleep(1)
print(“end123”)

def bar():
print(456)
time.sleep(3)
print(“end456”)

p1=Process(target=foo)
p2=Process(target=bar)

p1.daemon=True
p1.start()
p2.start()
print(“main-------”) #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止

复制代码

只是守护进程结束,非守护进程不受影响
四 进程同步(锁)

进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,

而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。

例1:多个进程共享同一打印终端
复制代码

#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
from multiprocessing import Process
import os,time
def work():
print(’%s is running’ %os.getpid())
time.sleep(2)
print(’%s is done’ %os.getpid())

if name == ‘main’:
for i in range(3):
p=Process(target=work)
p.start()

复制代码
复制代码

#由并发变成了串行,牺牲了运行效率,但避免了竞争
from multiprocessing import Process,Lock
import os,time
def work(lock):
lock.acquire()
print(’%s is running’ %os.getpid())
time.sleep(2)
print(’%s is done’ %os.getpid())
lock.release()
if name == ‘main’:
lock=Lock()
for i in range(3):
p=Process(target=work,args=(lock,))
p.start()

复制代码

例2:多个进程共享同一文件

文件当数据库,模拟抢票
复制代码

#文件db的内容为:{“count”:1}
#注意一定要用双引号,不然json无法识别
#并发运行,效率高,但竞争写同一文件,数据写入错乱
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open(‘db.txt’))
print(’\033[43m剩余票数%s\033[0m’ %dic[‘count’])

def get():
dic=json.load(open(‘db.txt’))
time.sleep(0.1) #模拟读数据的网络延迟
if dic[‘count’] >0:
dic[‘count’]-=1
time.sleep(0.2) #模拟写数据的网络延迟
json.dump(dic,open(‘db.txt’,‘w’))
print(’\033[43m购票成功\033[0m’)

def task(lock):
search()
get()
if name == ‘main’:
lock=Lock()
for i in range(100): #模拟并发100个客户端抢票
p=Process(target=task,args=(lock,))
p.start()

复制代码
复制代码

#文件db的内容为:{“count”:1}
#注意一定要用双引号,不然json无法识别
#购票行为由并发变成了串行,牺牲了运行效率,但保证了数据安全
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open(‘db.txt’))
print(’\033[43m剩余票数%s\033[0m’ %dic[‘count’])

def get():
dic=json.load(open(‘db.txt’))
time.sleep(0.1) #模拟读数据的网络延迟
if dic[‘count’] >0:
dic[‘count’]-=1
time.sleep(0.2) #模拟写数据的网络延迟
json.dump(dic,open(‘db.txt’,‘w’))
print(’\033[43m购票成功\033[0m’)

def task(lock):
search()
lock.acquire() #获取锁
get()
lock.release() #释放锁
if name == ‘main’:
lock=Lock()
for i in range(100): #模拟并发100个客户端抢票
p=Process(target=task,args=(lock,))
p.start()

复制代码

加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值