使用模块 multiprocessing
特殊进程
孤儿进程: 没爸爸,父进程退出了。有init进程自动收养,进行垃圾回收
僵尸进程: 爸爸在,子进程先退出,遗留的进程信息需要父进程进行释放。但是父进程忘记管他了
守护进程(daemon=True):
1.守护进程会在主进程代码执行结束后就终止
2.守护进程无法再开启子进程
注:多进程池和多进程都要放在main中声明
原因:官方说windows本身没有fork,导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资源)
启动方式
from multiprocessing import Process
def demo(var1, var2, name=None):
print('--------', var1, var2, name)
if __name__ == '__main__':
#参数介绍:
#target 目标函数
#args 调用参数元组
#kwargs 调用对象的字典
#daemon 是否为守护进程 默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
#name 是指的进程名称
p = Process(target=demo, args=(1, 2,), kwargs={"name": 'zhangsan'}, name='pro1')
p.start()
#进程方法
# 1 p.start():启动进程,并调用该子进程中的p.run()
# 2 p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
# 3 p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
# 4 p.is_alive():如果p仍然运行,返回True
# 5 p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
#进程属性
# 1 p.daemon:默认值为False
# 2 p.name:进程的名称
# 3 p.pid:进程的pid
# 4 p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
# 5 p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)
变量
#进程变量间数据隔离就是可以共享变量,但是变量本身不变。 要变:
1.使用共享变量manager
继承-自定义run方法
from multiprocessing import Process
import time
import os
class MyProcess(Process):
def __init__(self, person):
super().__init__()
self.person = person
def run(self):
print(os.getpid())
print(self.pid)
print(self.pid)
print(self.pid)
print('%s 正在和女主播聊天' % self.person)
# if self._target:
# self._target(*self._args, **self._kwargs) 这里就是原类中run方法声明
if __name__ == '__main__':
p1 = MyProcess('Jedan') #继承重写run方法
p1.start()
p1.join()
进程方法
方法基本同线程类似,这里用信号量为例
from multiprocessing import Process,Semaphore, Lock
import time, random
def go_ktv(sem, user):
# sem.acquire()
# print("%s 占用一间ktv小屋" %user)
# time.sleep(random.randint(0,3))
# sem.release()
with sem:
print("%s 占用一间ktv小屋" %user)
time.sleep(random.randint(0,3))
if __name__ == '__main__':
sem = Semaphore(5)
# lock = Lock()
p_1 = []
for i in range(13):
p =Process(target=go_ktv, args=(sem, 'user%s' %i,))
p.start()
p_1.append(p)
for p in p_1:
p.join()
print("===================>start:")
参考连接
lr:
- https://www.cnblogs.com/clschao/articles/9629392.html#part_7