Process类
构造方法
Process([group [, target [, name [, args [, kwargs]]]]])
group: 线程组,目前还没有实现,库引用中提示必须是None;
target:要执行的方法;
name:进程名;
args/kwargs:要传入方法的参数。
实例方法:
is_alive():返回进程是否在进行。
join([timeout]):阻塞当前上下文环境的进程,直到调用此方法的进程终止或达到指定的timeout(可选参数)。
start():进程准备就绪,等待CPU调度
run():start()调用run方法,如果实例进程时未制定传入target,这start执行默认run()方法。
terminate():不管任务是否完成,立即停止工作进程
属性
daemon:和线程的setDeamon功能一样
name:进程名字
pid:进程号
进程间通讯
进程队列Queue
import multiprocessing
import time
def setData(q):
time.sleep(1)
q.put(123)
q.put('lupe')
def getData(q):
print(q.get())
print(q.get())
print('sub process', id(q))
if __name__ == '__main__':
q = multiprocessing.Queue()
p1 = multiprocessing.Process(target=setData, args=[q])
p1.start()
print('main process', id(q))
getData(q)
管道
rom multiprocessing import Process, Pipe
def f(conn):
conn.send([12, {"name": "lupe"}, "hello"])
response = conn.recv()
print('response', response)
conn.close()
print('q ID2:', id(conn))
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
print('q_ID1:', id(child_conn))
p = Process(target=f, args=[child_conn])
p.start()
print(parent_conn.recv())
parent_conn.send('你好')
p.join()
Managers
Queue和pipe只是实现了数据交互,并没有实现数据共享,即一个进程去更改另一个进程的数据。
from multiprocessing import Process, Manager
def f(i, d, l):
d[i] = '1'
d['2'] = 2
l.append(i)
print('sub process:', id(d), id(l))
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict() # {}
l = manager.list(range(5)) # [0, 1, 2 ,3, 4]
print('main process:', id(d), id(l))
p_list = []
for i in range(10):
p = Process(target=f, args=[i, d, l])
p.start()
p_list.append(p)
for p in p_list:
p.join()
print(d)
print(l)