[問題] multiprocessing 的 Pool.map
系統:win7 x64 sp1
python:3.5.1
Pool.map 看官方文件是 blocking
所以應該可以印出 0~29 的所有數字
但發現,若 print 有設定 end,行為會變成是 blocking
請問這是 bug 嗎?感謝
程式碼如下
from multiprocessing import Pool
import time
def f(x):
time.sleep(0.1)
# NG
print(x, end=' ')
# OK
# print(x)
if __name__ == '__main__':
pool = Pool()
pool.map(f, range(30))
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.174.136.246
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1492876229.A.D58.html
※ 編輯: zps (1.174.136.246), 04/22/2017 23:51:16
→
04/23 01:20, , 1F
04/23 01:20, 1F
→
04/23 01:49, , 2F
04/23 01:49, 2F
→
04/23 01:49, , 3F
04/23 01:49, 3F
→
04/23 10:45, , 4F
04/23 10:45, 4F
→
04/23 10:46, , 5F
04/23 10:46, 5F
→
04/23 10:47, , 6F
04/23 10:47, 6F
→
04/23 12:11, , 7F
04/23 12:11, 7F
→
04/23 12:12, , 8F
04/23 12:12, 8F
→
04/23 12:13, , 9F
04/23 12:13, 9F
→
04/23 14:00, , 10F
04/23 14:00, 10F
→
04/23 14:01, , 11F
04/23 14:01, 11F
→
04/23 14:02, , 12F
04/23 14:02, 12F
→
04/23 14:02, , 13F
04/23 14:02, 13F
→
04/23 20:39, , 14F
04/23 20:39, 14F
→
04/23 20:40, , 15F
04/23 20:40, 15F
→
04/23 21:21, , 16F
04/23 21:21, 16F
感謝兩位,以下是我實驗的結果
跑出來的有三種結果,CPU 是雙核的,所以預設會產生兩個 subprocess
為求簡單,我改成 range(5),然後印出 pid
1. 沒印出任何東西
2. 4376 4376 4376 (印出三個 pid)
3. 5772 5772 (印出二個 pid)
就我個人的理解,因 print 會先 buffer,之後才會一併顯示在螢幕上
2 & 3 應該是相互覆蓋所造成的,但若是相互覆蓋造成的
理論上改為以下的 code 應該也是同樣的情況,加上 close() & join()
pool = Pool()
pool.map(f, range(5))
pool.close()
pool.join()
此時的結果會有兩種
5388 5388 5388 3188 3188 (印出五個 pid,前三後二)
5156 5156 5980 5980 5980 (印出五個 pid,前二後三)
卻可以正常顯示五個 pid,這裡跟我前面的推論矛盾了
而 1 的部分,完全沒印出東西,也是我覺得納悶的地方
在 win7x32, Python 3.6.1 下,也有一樣的情況
請問是否有什麼地方沒考慮到呢?
※ 編輯: zps (1.175.122.168), 04/23/2017 21:58:40
→
04/24 01:18, , 17F
04/24 01:18, 17F
→
04/24 19:08, , 18F
04/24 19:08, 18F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):