多进程
创建新进程
from multiprocessing import Process
# 子进程要执行的代码
def run_proc():
pass
if __name__ == "__main__":
p = Process(target=run_proc, args=('test',) # 创建新进程
p.start() # 启动新进程
p.join() # 等待新进程结束
print('Finished...') # 新进程结束后这条才会运行
关于Process
的参数
target=run_proc
, Python中一切皆对象,函数也是一个对象,所以这里可以直接传函数。args=('test',)
, 括号里的,
是为了表示这是个元组。
进程池
from multiprocessing import Pool
def run_proc():
pass
if __name__ == "__main__":
p = Pool(4) # 创建一个同时允许4个进程运行的进程池
for i in range(5): # 5次请求进程池创建新进程
p.apply_async(run_proc, args=(i,))
p.close() # 关闭进程池,关闭后无法请求运行新的进程
p.join() # 等待所有进程结束
- 当向进程池请求的进程数超过了进程池的大小时,多出的进程就必须等之前的进程释放才可以执行。
Pool()
默认大小是CPU的核心数
子进程
import subprocess
print('$ nslookup www.python.org')
r = subprocess.call(['nslookup', 'www.python.org'])
print('Exit code:', r)
如果子进程还需要输入,则可以通过communicate()方法输入:
import subprocess
print('$ nslookup')
p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('utf-8'))
print('Exit code:', p.returncode)
进程间通信
可以通过队列Queue
来实现
from multiprocessing import Process, Queue
def write(q, content):
q.put(content)
def read(q):
while True:
value = q.get(True)
print(value)
if __name__=='__main__':
q = Queue()
pw = Process(target=write, args=(q, 'a'))
pr = Process(target=read, args=(q,))
pw.start()
pr.start()
pw.join()
pr.terminate()