Python 多进程-学习笔记

整理自廖雪峰老师的Python教程

多进程

创建新进程

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()

猜你喜欢

转载自www.cnblogs.com/josephchuh/p/9229485.html