Python multiprocessing 使用手记[1] – 进程模型
首先从multiprocessing的进程模型开始看。
multiprocessing的目的是创建一个接å£å’Œpython.threading类似接å£çš„库,用多进程的方å¼æ¥å¹¶å‘处ç†ã€‚å› æ¤åˆ›å»ºä¸€ä¸ªæ–°çš„进程的的方法也和python.threading很åƒï¼š
import multiprocessing def dosomething(a,b,c): pass p = multiprocessing.Process(target=dosomething, args=(1,2,3)) p.start() p.join() |
创建的这个新的进程在*nix上é¢ä½¿ç”¨çš„是fork,这æ„味ç€å进程开始执行的时候具有与父进程相åŒçš„全部内容。请记ä½è¿™ç‚¹ï¼Œè¿™ä¸ªå°†æ˜¯ä¸‹é¢æˆ‘们讨论基于继承的对象共享的基础。所谓基于继承的对象共享,是说在创建å进程之å‰ç”±çˆ¶è¿›ç¨‹åˆå§‹åŒ–çš„æŸäº›å¯¹è±¡å¯ä»¥åœ¨å进程当ä¸ç›´æŽ¥è®¿é—®åˆ°ã€‚在Windowså¹³å°ä¸Šï¼Œå› 为没有forkè¯ä¹‰çš„系统调用,基于继承的共享对象比*nix有更多的é™åˆ¶ï¼Œæœ€ä¸»è¦å°±æ˜¯ä½“现在è¦æ±‚Processçš„__init__当ä¸çš„å‚æ•°å¿…é¡»å¯ä»¥Pickle。
但是,并ä¸æ˜¯æ‰€æœ‰çš„对象都是å¯ä»¥é€šè¿‡ç»§æ‰¿æ¥å…±äº«ï¼Œåªæœ‰multiprocessing库当ä¸çš„æŸäº›å¯¹è±¡æ‰å¯ä»¥ã€‚例如Queue,åŒæ¥å¯¹è±¡ï¼Œå…±äº«å˜é‡ï¼ŒManagerç‰ç‰ã€‚
在一个multiprocessing库的典型使用场景下,所有的å进程都是由一个父进程å¯åŠ¨èµ·æ¥çš„,这个父进程称为master进程。这个父进程éžå¸¸é‡è¦ï¼Œå®ƒä¼šç®¡ç†ä¸€ç³»åˆ—的对象状æ€ï¼Œä¸€æ—¦è¿™ä¸ªè¿›ç¨‹é€€å‡ºï¼Œå进程很å¯èƒ½ä¼šå¤„于一个很ä¸ç¨³å®šçš„状æ€ï¼Œå› 为它们共享的状æ€ä¹Ÿè®¸å·²ç»è¢«æŸåæŽ‰äº†ã€‚å› æ¤ï¼Œè¿™ä¸ªè¿›ç¨‹æœ€å¥½å°½å¯èƒ½åšæœ€å°‘的事情,以便ä¿æŒå…¶ç¨³å®šæ€§ã€‚