python-42-Process多进程

前言

初识 Process 多进程模块,能够使启动一个主进程的时候会自动创建一个或多个子进程,进程里的第一个进程就是主进程

程序执行的实例,每一个进程都有唯一的pid,每个子进程的数据都是互相隔离的。方法:

  • .start():开启一个子进程
  • .join():感知一个子进程的结束
  • .terminate():结束一个子进程
  • .is_alive():查看某个子进程是否还在运行

同步:只能等待一个事情做完了才能做另一个事情,比如先做完A才能做B。

异步:并行做多个事情,比如一边做A的事情,同时也在做B的事情。

一、函数中的多进程

1、没约束时,不会待进程执行完再执行下面的代码:

from multiprocessing import Process

def func(arg1,arg2):
    print('arg1:',arg1)
    print('arg2:',arg2)

if __name__ == '__main__':
    p=Process(target=func,args=(5,8))
    p.start()
    print('》》》最后一行代码的打印') # 没约束时,不会待进程执行完再执行下面的代码

2、join():感知子进程的结束,将异步变为同步。

# 2、join():感知子进程的结束,将异步变为同步
from multiprocessing import Process

def func(arg1,arg2):
    print('arg1:',arg1)
    print('arg2:',arg2)

if __name__ == '__main__':
    p=Process(target=func,args=(5,8))
    p.start()
    p.join()        # 感知子进程的结束,将异步变为同步
    print('》》》最后一行代码的打印')

 3、多个子进程执行,列表推导式:必须执行完多个子进程后,再执行下面的代码。

from multiprocessing import Process
import time

def func(arg1,arg2):
    print('arg1:',arg1)
    time.sleep(0.1)
    print('arg2:',arg2)

if __name__ == '__main__':
    p_list=[]
    for i in range(5):              # 异步多个子进程执行
        p = Process(target=func, args=(1*i, 10))
        p_list.append(p)
        p.start()
    [p.join() for p in p_list]      # 必须执行完多个子进程后,再执行下面的代码。
    print('哈哈哈!')

 二、类中的多进程

1、自定义类,继承Process。

注意:传参数需用继承的方法解决,super().__init__()

# 4、另一种多进程,自定义类继承Process
from multiprocessing import Process
import time
class My_func(Process):
    def __init__(self,num):
        super().__init__()      # 传参数需用继承的方法解决
        self.num=num

    def run(self):
        '''下面多进程要运行的代码'''
        print(self.num)
        time.sleep(0.1)
        print(self.num*self.num)
if __name__ == '__main__':
    p1=My_func(1)
    p1.start()
    p2=My_func(2)
    p2.start()

 三、守护进程与进程锁

1、守护进程随着主进程的代码执行完毕而结束:p.daemon=True 

from multiprocessing import Process
import time
def func():
    while 1:
        time.sleep(1)
        print('func1')
if __name__ == '__main__':
    p=Process(target=func)
    p.daemon=True           # 设置为守护进程
    p.start()
    print(1)
    print(p.is_alive())     # 查看进度是否存在,返回bool
    time.sleep(2)
    # p.terminate()           # 结束一个进程
    print(p.is_alive())
    time.sleep(2)
    print('守护进程随着所有主进程执行后而结束!!')
    print(p.is_alive())

 2、进程锁,比如抢票会有多个用户一起抢。

①没有锁进程的情况下:发现余票只有一张,但每个进程都能抢到票了,实际也就只有一张改怎么办?

 ②进程锁:Lock

这样就可以解决类似这样的问题。

from multiprocessing import Process,Lock
import time,json
def find():
    with open(r'test.py')as f:
        d = json.load(f)
    print('剩余免费门票:%s'%d['count'])

def buy(i,lock):
    lock.acquire()                          # 拿钥匙
    with open(r'test.py')as f:
        d = json.load(f)
    if d['count']<=0:print('门票已被抢完~')
    else:
        print('恭喜用户 %s 成功抢到门票了'%i)
    if d['count']!=0:d['count']-=1
    time.sleep(0.2)
    with open(r'test.py','w')as f:
        json.dump(d,f)
    lock.release()                          # 还钥匙
if __name__ == '__main__':
    for i in range(1):       # 5个进程同时查询
        p=Process(target=find)
        p.start()
    lock=Lock()
    for i in range(5):
        p1=Process(target=buy,args=(i,lock))
        p1.start()

 欢迎来大家QQ交流群一起学习:482713805

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车尾龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值