一.开启进程的两种方式:
方式一: # 方式一: 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()