1. multiprocessing模块
1.1 直接调用
import multiprocessing
import time
def f(name):
time.sleep(1)
print("hello", name, time.ctime())
if __name__ == "__main__":
p_list = []
for i in range(3):
p = multiprocessing.Process(target=f, args=("alvin",))
p_list.append(p)
p.start()
for p in p_list:
p.join()
print("end", time.ctime())
1.2 继承式调用
import multiprocessing
import time
class MyProcess(multiprocessing.Process):
def __init__(self, name):
super(MyProcess, self).__init__()
self.name = name
def run(self):
time.sleep(1)
print("hello", self.name, time.ctime())
if __name__ == '__main__':
p_list = []
for i in range(3):
p = MyProcess("alvin")
p.start()
p_list.append(p)
for p in p_list:
p.join()
print("end", time.ctime())
1.3 父进程和子进程的关系
import multiprocessing
import os
import time
def info(title):
print(title)
print("module name:", __name__)
print("parent process:", os.getppid()) #父进程的ID
print("process id:", os.getpid()) #当前进程的ID
def f(name):
info('\033[31;1mfunction f\033[0m')
print("hello", name)
if __name__ == '__main__':
info('\033[32;1mmain process line\033[0m')
time.sleep(3)
p = multiprocessing.Process(target=f, args=('bob',))
p.start()
p.join()
2. 进程间通讯
不同进程间内存是不共享的,要实现两个进程间的数据交换,可使用Queue和Pipe,使用Managers来进行数据共享。
2.1 Queue队列
通过pickle序列化存储起来,传递给另一个进程,然后另一个进程反pickle取出来
from multiprocessing import Queue,Process
def f(q):
q.put([42, 2, 'hello'])
print("\033[36;1msub q id\033[0m", id(q))
if __name__ == '__main__':
q = Queue()
p_list = []
print("\033[31;1mmain q id\033[0m",id(q))
for i in range(3):
p = Process(target=f, args=(q,))
p_list.append(p)
p.start()
print(q.get())
print(q.get())
print(q.get())
for p in p_list:
p.join()
在Linux上四个ID全部相同
2.2 Pipe管道
from multiprocessing import Pipe,Process
import os
def f(con):
con.send([42, None, 'hello'])
print(con.recv(), "int the %s" % os.getpid())
con.close()
if __name__ == '__main__':
parent_con, child_con = Pipe()
p = Process(target=f, args=(child_con,))
p2 = Process(target=f, args=(child_con,))
p.start()
p2.start()
print(parent_con.recv())
print(parent_con.recv())
parent_con.send('hello')
parent_con.send('python')
p.join()
2.3 Manager数据共享
from multiprocessing import Process, Manager
def f(d, l, n):
d[n] = '1'
d['2'] = 2
d[0.25] = None
l.append(n)
print("sub:",id(d))
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict() #创建一个字典
l = manager.list(range(5)) #创建一个列表
p_list = []
print("main:",id(d))
for i in range(10): #创建10个进程
p = Process(target=f, args=(d, l, i))
p.start()
p_list.append(p)
for res in p_list:
res.join()
print(d)
print(l)