day 29

Python多进程详解
本文介绍了Python中使用multiprocessing模块开启进程的两种方法:通过Process类直接启动任务函数和继承Process类定义子进程;讲解了join方法如何使主进程等待子进程完成;探讨了进程间内存隔离的特点;解释了僵尸进程和孤儿进程的概念;演示了如何设置守护进程;并介绍了如何利用互斥锁保证数据的一致性。

一.开启进程的两种方式:

方式一:
# 方式一:
from multiprocessing import Process
import  time

def task():
    print("1111")
    time.sleep(0.5)
    print("22222")


# 在windows中开启进程必须在 __name__ == "__main__"代码中:
if __name__ == "__main__":
    p = Process(target=task)
    p.start()  # 像操作系统发送一个开辟进程的请求(需要一段时间间隔)
    print("333")
#为何会先打印333:是因为在请求的同时(有一段时间间隔),计算会继续工作,从而打印下面的主进程

方式二.
from multiprocessing import Process
import  time

class Myprocess(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print("1111")
        time.sleep(1)
        print("2222")

# 在windows中开启进程必须在 __name__ == "__main__"代码中:
if __name__ == "__main__":
    p = Myprocess("jxl")
    p.start()  # 像操作系统发送一个开辟进程的请求(需要一段时间间隔)
    time.sleep(0.5)
    print("333")

二.join(让主进程在原地等待,等待子进程运行完毕后,不会影响子进程的执行)

from multiprocessing import Process
import time


def task(i):
    print("子进程:%s" % i)
    print(i * 10)

p_l=[]
if __name__ == "__main__":
    for i in range(10):
        p = Process(target=task, args=(i,))
        p_l.append(p)
        p.start()
    for p in p_l:
        p.join()
    print("主进程来了")

三.进程之间的内存空间互相隔离

 

from multiprocessing import Process

n = 100
def task():
    global n
    n = 0
    print(n)


if __name__ == "__main__":
    p = Process(target=task)
    p.start()
    print(n)  #打印的是主进程的n,不受子进程的影响

 

四.

1.僵尸进程:在linux中,一个进程使用fork创建子进程,如果子进程退出,而父进程没有去获取子进程的状态信息,那么这些这些子进程的描述符任然保存在系统中
2. 孤儿进程:一个父进程退出,而他的子进程们还在运行,那么子进程将变成孤儿进程会被init进程收养

五.守护进程:本质就是一个子进程,该子进程的生命周期<=被守护进程的生命周期 p.daemon=True

from multiprocessing import Process
import  time
def task():
    print("正在守护")
    time.sleep(1)
    print("已死")

if __name__ == "__main__":
    p = Process(target=task)
    p.daemon=True
    p.start()
    time.sleep(0.5)
    print("主进程死了")  #打印的是主进程的n,不受子进程的影响

六.互斥锁:


from multiprocessing import Process, Lock
import json
import time
import random


def search(name): # 查找车票
with open("db.json", 'rt', encoding="utf-8")as f:
dic = json.load(f)
time.sleep(1)
print("%s:还有余票 %s" % (name, dic["count"]))


def get(name):
with open("db.json", 'rt', encoding="utf-8")as f:
dic = json.load(f)
if dic["count"] > 0:
dic["count"] -= 1
time.sleep(random.randint(1, 3))
with open("db.json", 'wt', encoding="utf-8")as f:
json.dump(dic, f)
print("%s:购票成功" %name)
else:
print("%s:已经没有票可买" % name)


def task(name, mutex):
search(name)
# mutex.acquire()
get(name) # 串行
# mutex.release()
# with mutex:
# get(name)

if __name__ == "__main__":
mutex = Lock()
for i in range(10):
p = Process(target=task, args=("用户:%s" % i, mutex,))
p.start()
# p.join()

 

 

转载于:https://www.cnblogs.com/jxl123/p/9592987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值