day 29

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

方式一:
# 方式一:
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