python3全栈开发-多进程的守护进程、进程同步、生产者消费者模式(重点)

内容预览:
  • 这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道~
  • 默认情况下,此方法由不是q的原始创建者的所有进程调用~
  •     为什么要使用生产者和消费者模式 在线程世界里,生产者就...~

一、守护进程

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

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

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


from multiprocessing import Process,Lock

import time
mutex
=Lock()
def task(name):
print("%s is running"%name)
time.sleep(
3)

if __name__=="__main":
p
=Process(target=task,args=("duoduo",))
p.daemon
=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print("----------------->")

守护进程运用

二、进程同步(锁)

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

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

part1:多个进程共享同一打印终端


#并发运行,效率高,但竞争同一打印终端,带来了打印错乱

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()

加锁状态

part2:多个进程共享同一文件

文件当数据库,模拟抢票


#文件db的内容为:{"count":1}

#
注意一定要用双引号,不然json无法识别
from multiprocessing import Process
import time,json,random
def search():
dic
=json.load(open('db.txt'))
print('
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论