lession11
一 守护进程
独立的进程

1 主进程会等待子进程结束,但是不等待守护进程结束,当主进程死亡后,等待子进程结束,不等待守护进程
from multiprocessing import Process
import time
import random

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

if name==”main“:
p=Piao(‘egon’)
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
p1=Piao(‘egon’)
p1.start()
print(‘主’)

2 守护线程

from threading import Thread
import time

def foo():
print(123)
time.sleep(1)
print(234)

def bar():
print(456)
time.sleep(2)
print(4567)

if name==”main“:
t1 = Thread(target=foo)
t2 = Thread(target = bar)

  1. t1.daemon = True
  2. t1.start()
  3. t2.start()
  4. print("over")

3 互斥锁
lock 将 并行变成串行
虽然可以用文件共享数据实现进程间通信,但问题是:
1.效率低(共享数据基于文件,而文件是硬盘上的数据)
2.需要自己加锁处理
from multiprocessing import Process,Lock
import time,json,random,os

def search():
dic = json.load(open(“db.txt”))
print(“user {}”.format(os.getpid()))
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(“user {}”.format(os.getpid()))
print(“success”)

def task(lock):

  1. search()
  2. lock.acquire()
  3. get()
  4. lock.release()

if name == “main“:
lock = Lock()
# lock.release()
for i in range(100):
p = Process(target=task,args=(lock,))
p.start()
print(1111,p.pid)

#生产者消费者模型总结

  1. #程序中有两类角色
  2. 一类负责生产数据(生产者)
  3. 一类负责处理数据(消费者)
  4. #引入生产者消费者模型为了解决的问题是:
  5. 平衡生产者与消费者之间的工作能力,从而提高程序整体处理数据的速度
  6. #如何实现:
  7. 生产者<-->队列<——>消费者
  8. #生产者消费者模型实现类程序的解耦和

为了解决进程退不出的问题
可以给queue中发送None 告知结束

互斥锁

互斥锁
from threading import Thread,Lock
import time

mutex = Lock()
n = 100

def task():
global n
with mutex:
temp = n
time.sleep(0.1)
n = temp -1
if name == “main“:
t_1 = []
start_time = time.time()
for i in range(100):
t = Thread(target=task)
t_1.append(t)
t.start()
t.join()
for t in t_1:
t.join()
print(n)
print(time.time()-start_time)

import threading
import time
def haha(max_num):
for i in range(max_num):
time.sleep(1)
print(i)
time.sleep(3)

l = []
for x in range(3):
t=threading.Thread(target=haha,args=(5,))
t.start()
l.append(t)
t.join()
#通过join方法让线程逐条执行
print(“ok”)
start_time = time.time()
for x in l:
x.join()
print(time.time()-start_time)

GIL全局解释锁
我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
方案一:开启四个进程
方案二:一个进程下,开启四个线程

  如果四个任务是计算密集型,没有多核来并行计算,方案一徒增了创建进程的开销,方案二胜
  如果四个任务是I/O密集型,方案一创建进程的开销大,且进程的切换速度远不如线程,方案二胜

  如果四个任务是计算密集型,多核意味着并行计算,在python中一个进程中同一时刻只有一个线程执行用不上多核,方案一胜
  如果四个任务是I/O密集型,再多的核也解决不了I/O问题,方案二胜  如果四个任务是计算密集型,没有多核来并行计算,方案一徒增了创建进程的开销,方案二胜
  如果四个任务是I/O密集型,方案一创建进程的开销大,且进程的切换速度远不如线程,方案二胜

递归锁

进程池

线程池

concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor:线程池,提供异步调用
ProcessPoolExecutor: 进程池,提供异步调用

submit 提交任务 是异步提交任务
from concurrent.futures import ProcessPoolExecutor
import os, time ,random

def task(n):
print(“{} is running”.format(os.getpid()))
time.sleep(random.randint(1,3))
return n ** 2
if name == “main“:
p = ProcessPoolExecutor()
for i in range(10):
p.submit(task,i)

版权声明:本文为liuqimin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liuqimin/p/9221934.html