Python multiprocessing库使用手记(引å)
å‰æ®µæ—¶é—´åœ¨åšçš„一个Python项目,需è¦å®žçŽ°ä¸€ä¸ªåŽå°æœåŠ¡ç¨‹åºï¼Œç¨‹åºæµç¨‹æ¯”较å¤æ‚,而且å¯èƒ½ç»å¸¸å˜åŠ¨ï¼Œä½†æ˜¯å¦‚果把整个æµç¨‹åˆ‡åˆ†æˆä¸€äº›æ¥éª¤ï¼Œæ¯ä¸ªæ¥éª¤æœ‰è‡ªå·±çš„输入输出和处ç†ã€‚åªè¦å°†ä»–们的输入输出接在一起,进行ä¸åŒçš„组åˆå°±å¯ä»¥å®žçŽ°å¸¸è§çš„æµç¨‹å˜åŠ¨ã€‚
ä½¿ç”¨å¤šè¿›ç¨‹çš„åŽŸå› æ˜¯è€ƒè™‘åˆ°Python的全局解释器é”(Global Interceptor Lock, GIL)。由于GILçš„å˜åœ¨ï¼Œåœ¨CPU密集型的程åºå½“ä¸ï¼Œä½¿ç”¨å¤šçº¿ç¨‹å¹¶ä¸èƒ½æœ‰æ•ˆåœ°åˆ©ç”¨å¤šæ ¸CPUçš„ä¼˜åŠ¿ï¼Œå› ä¸ºä¸€ä¸ªè§£é‡Šå™¨åœ¨åŒä¸€æ—¶åˆ»åªä¼šæœ‰ä¸€ä¸ªçº¿ç¨‹åœ¨æ‰§è¡Œã€‚è¦æƒ³å°½å¯èƒ½åˆ©ç”¨å¤šæ ¸CPU并å‘,多进程是必需的。
引入多进程就带æ¥å‡ 个问题:首先是这ç§è®¾è®¡æ–¹æ¡ˆéœ€è¦ä¸€ä¸ªç±»ä¼¼äºŽUNIX Pipe的底层结构,说的更确切一点就是message queue,æ“作类似于Pythonçš„Queue.Queue。å¦ä¸€ä¸ªé—®é¢˜å°±æ˜¯éœ€è¦ä¸€ä¸ªè¿›ç¨‹é—´ä¿¡æ¯å…±äº«çš„基础设施。
先说Queue,这个Queue需è¦æ»¡è¶³ä¸‹é¢ä¸€äº›éœ€æ±‚,优先级递å‡ï¼š
- è½»é‡ – ä¸éœ€è¦ä¾èµ–æ•°æ®åº“ç‰æ¯”较é‡åž‹çš„程åºã€‚代价就是丢点东西没关系;
- 跨进程 – 读端和写端å¯ä»¥ä¸åœ¨ä¸€ä¸ªè¿›ç¨‹å½“ä¸ï¼›
- 支æŒå¤šè¿›å¤šå‡º – 读端和写端都è¦æ”¯æŒå¤šä¸ªè¿›ç¨‹ï¼›
- 稳定和高效 – 这个就ä¸ç”¨å¤šè¯´äº†å§ï¼›
- 有Pythonçš„API,å†ä¸æµŽè¦æœ‰Cçš„APIå¯ä»¥è®©æˆ‘写Pythonçš„binding。
å¦å¤–是进程间共享的设施,系统shm是迫ä¸å¾—å·²ä½¿ç”¨çš„ï¼Œå› ä¸ºè¦è‡ªå·±å¤„ç†Picklingå’ŒUnpickling,以åŠä¸€äº›æ‚七æ‚八的竞争æ¡ä»¶é—®é¢˜ã€‚有建构在上é¢çš„现æˆçš„库最好。
最终出于轻é‡çš„考虑,选定了Pythonçš„multiprocessing库,而没有用IPC MQ 或 RabbitMQ。这个库在Python2.6è¢«å¼•å…¥åˆ°æ ‡å‡†åº“å½“ä¸ï¼Œæœ‰ä¸º2.5æ供的backportã€‚å› ä¸ºæˆ‘ä»¬çš„ç³»ç»Ÿä½¿ç”¨çš„æ˜¯2.5ç‰ˆæœ¬ï¼Œå› æ¤æˆ‘们使用的其实是2.5çš„backport。这个实现除了一些细æžæœ«èŠ‚çš„åœ°æ–¹ä¹‹å¤–ï¼Œæ ¸å¿ƒå®žçŽ°å’Œ2.6æ ‡å‡†åº“å½“ä¸æ˜¯å®Œå…¨ä¸€æ ·çš„。
在使用过程当ä¸ï¼Œé‡åˆ°äº†æŒºå¤šçš„问题,在这里一一记录。
您好ï¼æˆ‘是pythonçš„åˆå¦è€…ï¼Œçœ‹äº†ä½ çš„blogå¦åˆ°ä¸å°‘,最近我è¦å®‰è£…一个*.py的程åºï¼Œä½†æ˜¯æ€»å‡ºçŽ°æ²¡æœ‰å‘现multiprocessing,表示在安装python时候出现错误,没有给予multiprocessingã€‚å› æ¤æˆ‘想询问一下,在window xp安装python如何进行multiprocessing,我在安装•Python 2.7.2 Windows Installer (Windows binary — does not include source)时候没有选择项目è¦æ±‚安装multiprocessing。安装过程都是nextå°±okäº†ã€‚æ‰€ä»¥è¯·æ•™æ‚¨å¦‚ä½•æ·»åŠ å¦‚multiprocessing。
还有一个问题,我是在å•æœºä¸Šè¿è¡Œï¼Œæ²¡æœ‰è¿›è¡Œå¤šå¤„ç†å™¨ï¼Œè¿™æ ·è¡Œå—。
å¸Œæœ›èƒ½å¾—åˆ°ä½ çš„æŒ‡å¯¼ã€‚è°¢è°¢
@dreamfly_ykf 装完 在python2.7目录下的scripts目录下有easy_installçš„ ä¸çŸ¥é“我ç†è§£çš„对ä¸å¯¹