python多进程

创建子进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from  multiprocessing import Process
import os
 
#子进程要执行的代码
def run_proc(name):
    print('Run child process %s (%s)...' % (name, os.getpid()))
 
if __name__=='__main__':
   print('Parent process %s.' % os.getpid())
   = Process(target=run_proc, args=('test',))
   print('Child process will start.')
   p.start()
   p.join()
   print('Child process end.')

image.png

用Process来创建子进程

Process([group [, target [, name [, args [, kwargs]]]]]) 

target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。Name为别名。Group实质上不使用。

进程池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from multiprocessing import Pool
import os, time, random
 
def log_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random()*3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end-start)))
 
if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    #pool默认大小是cpu核数
    = Pool(4)
    for in range(5):
        #pool.apply_async()用来向进程池提交目标请求
        p.apply_async(log_time_task, args=(i,))
    print('Wating for all subprocess done.')
    p.close()
    #pool.join()是用来等待进程池中的worker进程执行完毕,防止主进程在worker进程结束前结束.
    #但pool.join()必须使用在pool.close()或者pool.terminate()之后.
    #其中close()跟terminate()的区别在于close()会等待池中的worker进程执行结束再关闭pool,而terminate()则是直接关闭.
    p.join()
    print('All subprocesses done.')
 
    #result.successful()表示整个调用执行的状态,如果还有worker没有执行完,则会抛出AssertionError异常。
    #利用multiprocessing下的Pool可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。

image.png

pool默认大小是cpu核数

pool.join()是用来等待进程池中的worker进程执行完毕,防止主进程在worker进程结束前结束. 

但pool.join()必须使用在pool.close()或者pool.terminate()之后. 

其中close()跟terminate()的区别在于close()会等待池中的worker进程执行结束再关闭pool,而terminate()则是直接关闭.

result.successful()表示整个调用执行的状态,如果还有worker没有执行完,则会抛出AssertionError异常。 

利用multiprocessing下的Pool可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。

子进程

很多时候子进程并不是自身,而是一个外部进程。我们创建了子进程后,还需要进程的输入和输出。

subprocess模块可以让我们非常方便的启动一个子进程,然后控制其输入输出。

进程间通信

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000