multiprocessing模块
与进程相关的模块
使用main进程创建子进程
from multiprocessing import Process
import os
def func():print("这是一个func函数,进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))
if __name__ == '__main__':print("这是主函数:进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))p = Process(target=func)p.start()
可以给子进程传递参数,传递的格式是一个元组
from multiprocessing import Process
import time
import os
def func(i):print("这是一个func函数,进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))print("{}".format(i))
if __name__ == '__main__':print("这是主函数:进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))p = Process(target=func,args=(123,))p.start()
不能获取子进程的返回值
可以同时开启多个子进程,同时开启的子进程并发执行
from multiprocessing import Process
import time
import os
def func1(i):print("这是一个func1函数,进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))print("{}".format(i))
def func2(i):print("这是一个func2函数,进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))print("{}".format(i))
if __name__ == '__main__':print("这是主函数:进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))p = Process(target=func1,args=(123,))p2 = Process(target=func2,args=("456",))p.start()p2.start()
join的用法(同步阻塞)
阻塞其他进程,只有当join的进程运行完毕之后才可以执行后续进程
from multiprocessing import Process
import time
import os
def func1(name,age):print("发送邮件给{}岁的{}".format(name,age))time.sleep(1)print("发送完毕!{}".format(name))
if __name__ == '__main__':print("这是主函数:进程号为:{},父进程号为:{}".format(os.getpid(),os.getppid()))list_new = [("a",12),("b",11),("c",10),("d",9)]for arg in list_new:p = Process(target=func1,args=arg)p.start()p.join()print("所有邮件全部发送完毕!")
多个进程之间数据不共享
from multiprocessing import Process
n = 0
def fuc():global nn += 1
if __name__ == '__main__':list_new = []for i in range(100):p = Process(target=fuc)p.start()list_new.append(p)for i in list_new:i.join()print(n)
使用面向对象的方法运行进程
import os
from multiprocessing import Process
class Myprocess(Process):def __init__(self,a,b,c):self.a = aself.b = bself.c = csuper().__init__()def run(self):print("子进程:{}父进程:{}".format(os.getpid(),os.getppid()))print("{}|{}|{}".format(self.a,self.b,self.c))
if __name__ == '__main__':print("这是主进程")p = Myprocess(45,56,67)p.start()
进程的其他属性
p.pid p.ident 查看进程号
p.name 查看进程名
p.daemon 设置进程为守护进程
p.terminate 结束进程
p.is_alive 查看进程是否为活跃状态
import os
import time
from multiprocessing import Process
class Myprocess(Process):def __init__(self,a,b,c):self.a = aself.b = bself.c = csuper().__init__()def run(self):print("子进程:{}父进程:{}".format(os.getpid(),os.getppid()))print("{}|{}|{}".format(self.a,self.b,self.c))
if __name__ == '__main__':print("这是主进程")p = Myprocess(45,56,67)p.daemon = Trueprint(p.name)p.is_alive()time.sleep(1)p.start()print(p.pid,p.ident)p.terminate()p.is_alive()