python3进程实操学习备忘
#!/usr/bin/env python3
#coding:utf-8
'''
进程:
1.python因为gil锁的原因,实际上多线程是没法实现真正意义的并发的。多进程解决了此问题
2.问题:多进程,进程之前沟通或存取同一数据是一个问题。需要第3方工具协助!
3.创建多进程时,实际上是复制了一份数据!
4.父进程和子进程之间通讯可通过Queue(进程里的队列,与线程的队列不同)、Pipe(管道)、Manager()三种方式解决
5.if __name__ == "__main__": 创建多进程的时候,此句必须增加,要不容易造成僵局进程
6.IDE为主进程的父进程,主进程是子进程的父进程
'''
#************Manager(进程专用)实现进程间数据互传*************
from multiprocessing import Process,Manager
import time
def f(dct,lst,i):
dct[i] = "zuly"
lst[i] = 3
dct["aaa"] = "b"
if __name__ == "__main__":
with Manager() as manager: # 用with创建manager实例(不需要close()关闭)
dct = manager.dict() # 创建一个manager的字典,用来与子进程进行沟通
lst = manager.list(range(2)) # 创建一个manager的列表,用来与子进程进行沟通
p_lst = []
for i in range(2):
p = Process(target = f, args = (dct, lst, i)) # 创建子进程,同时把manager字典及manager列表传送给到子进程处理
p.start()
p_lst.append(p)
for i in p_lst:
i.join()
for i in dct:
print("dct[%s]=%s"%(i,dct[i])) # 获得子进程处理完后传送回来的manager字典
for i in range(len(lst)):
print("lst[%s]=%s"%(i,lst[i])) # 获得子进程处理完后传送回来的manager列表
print("end")
'''
#************Pipe(进程专用)实现进程间数据互传*************
from multiprocessing import Process,Pipe
import time
def f(conn):
a = "zuly"
conn.send("this is aaa...") # 子进程发送数据给到主进程
conn.send(a)
print(conn.recv()) # 子进程接收主进程传来的数据
conn.close() # 关闭管理的子连接
if __name__ == "__main__":
parent_conn,child_conn = Pipe() # 创建管道实例,获得主进程连接、子进程连接
p_list = []
for i in range(2):
parent_conn.send("aaaa") # 主进程发送数据给到子进程
p = Process(target = f, args = (child_conn,)) # 把管道的子连接传送给到子进程使用
p.start()
p_list.append(p)
for i in p_list:
i.join()
for i in range(2):
print(parent_conn.recv()) # 主进程接收子进程传来的数据。一收一发
print(parent_conn.recv())
print("end")
'''
'''
#************Queue(进程专用)实现进程间数据互传*************
from multiprocessing import Process,Queue
def f(q,i):
q.put(i) # 子进程对队列进行操作
if __name__ == "__main__":
q = Queue() # 创建队列实例
p_list = []
for i in range(3):
p = Process(target = f, args = (q,i)) # 把队列传给子进程执行
p.start()
p_list.append(p)
for i in p_list:
i.join()
print(q.get()) # 主进程进行使用经过子进程处理过的队列
print(q.get())
print(q.get())
'''
'''
#************类方式创建多进程的*************
from multiprocessing import Process
import time
import os
class MyProcess(Process): # 创建一个多进程类(继续多进程模块Process)
def __init__(self,name,i): # 创建实例时,自动调用init方法(需要先调用执行父类Process的init方法),之后,再封装一定的数据到类里
super(MyProcess,self).__init__()
self.name = name + str(i)
def run(self): # 必须是run方法,底下内容各进程要执行的共同代码
time.sleep(1)
print("%s逻辑代码都在此执行。相当于函数%s"%(self.name,time.ctime()))
print("子进程的pid是:%s"%os.getpid())
print("子进程的父进程pid是:%s"%os.getppid())
if __name__ == "__main__": # 创建多进程的时候,此句必须增加,要不容易造成僵局进程
p_list = []
print("主进程的pid是:%s"%os.getpid()) # 获得进程id
print("主进程的父进程pid是:%s"%os.getppid()) # 获得父进程id
for i in range(5):
p = MyProcess("zuly",i) # 创建多进程--实例化,并封装数据进实例里
p.start() # 启动进程
p_list.append(p)
for i in p_list:
i.join()
print("end")
'''
'''
#************普通方式创建多进程的*************
from multiprocessing import Process
import time
def f(name,i):
time.sleep(1)
print("name is %s,%s"%(name,str(i)))
if __name__ == "__main__":
p_list = []
for i in range(10):
p = Process(target = f, args = ("zuly",i)) # 创建了10个进程(与线程差不多)
p_list.append(p)
p.start()
for i in p_list:
i.join()
print("end")
'''