创建子进程
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()) p = Process(target = run_proc, args = ( 'test' ,)) print ( 'Child process will start.' ) p.start() p.join() print ( 'Child process end.' ) |
用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核数 p = Pool( 4 ) for i 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可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。 |
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