[英]Python multiprocessing doesn't work as predicted
我在網上找到了這個代碼,預測結果應該顯示當前正在處理的進程名稱,但是當我運行代碼時它只給出結果而不是名稱。 我正在運行Windows 7 Python 2.7.3。
碼:
import multiprocessing
def do_calculation(data):
return data * 2
def start_process():
print 'Starting', multiprocessing.current_process().name
if __name__ == '__main__':
inputs = list(range(10))
print 'Input :', inputs
builtin_outputs = map(do_calculation, inputs)
print 'Built-in:', builtin_outputs
pool_size = multiprocessing.cpu_count() * 2
pool = multiprocessing.Pool(processes=pool_size,
initializer=start_process,
)
pool_outputs = pool.map(do_calculation, inputs)
pool.close() # no more tasks
pool.join() # wrap up current tasks
print 'Pool :', pool_outputs
預期結果:
$ python multiprocessing_pool.py
Input : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Built-in: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Starting PoolWorker-11
Starting PoolWorker-12
Starting PoolWorker-13
Starting PoolWorker-14
Starting PoolWorker-15
Starting PoolWorker-16
Starting PoolWorker-1
Starting PoolWorker-2
Starting PoolWorker-3
Starting PoolWorker-4
Starting PoolWorker-5
Starting PoolWorker-8
Starting PoolWorker-9
Starting PoolWorker-6
Starting PoolWorker-10
Starting PoolWorker-7
Pool : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
如果我在控制台中運行以下代碼而不是IDLE (我在使用PyCharm之后會繼續使用):
from multiprocessing import *
def main():
data = list(range(10))
print('Data:', data)
result = list(map(calculate, data))
print('Map: ', result)
pool = Pool(cpu_count() * 2, initialize)
result = pool.map(calculate, data, 1)
pool.close()
pool.join()
print('Pool:', result)
def calculate(number):
return number * 2
def initialize():
print('Starting', current_process().name)
if __name__ == '__main__':
main()
以下內容將按預期打印到控制台屏幕上(使用PoolWorkers的隨機順序):
C:\Users\schappell\Desktop>stack_overflow.py
Data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Map: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Starting PoolWorker-1
Starting PoolWorker-13
Starting PoolWorker-2
Starting PoolWorker-3
Starting PoolWorker-8
Starting PoolWorker-5
Starting PoolWorker-14
Starting PoolWorker-16
Starting PoolWorker-15
Starting PoolWorker-12
Starting PoolWorker-6
Starting PoolWorker-9
Starting PoolWorker-4
Starting PoolWorker-10
Starting PoolWorker-7
Starting PoolWorker-11
Pool: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
C:\Users\schappell\Desktop>
作為旁注,請嘗試運行以下代碼(使用和不使用time.sleep
注釋掉):
from multiprocessing import *
import time
def main():
data = list(range(10))
print('Data:', data)
print('Map: ', list(map(calculate, data)))
pool = Pool(cpu_count() * 2, initialize)
## time.sleep(1)
print('Pool:', pool.map(calculate, data, 1))
pool.close()
pool.join()
def calculate(number):
return number * 2
def initialize():
print('Starting', current_process().name)
if __name__ == '__main__':
main()
沒有睡眠,你可能會得到這樣的東西(顯示你的游泳池尚未完全創建):
C:\Users\schappell\Desktop>stack_overflow.py
Data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Map: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Starting PoolWorker-2
Pool: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Starting PoolWorker-1
Starting PoolWorker-10
Starting PoolWorker-9
Starting PoolWorker-6
Starting PoolWorker-14
Starting PoolWorker-13
Starting PoolWorker-5
Starting PoolWorker-4
Starting PoolWorker-3
Starting PoolWorker-8
Starting PoolWorker-11
Starting PoolWorker-12
Starting PoolWorker-16
Starting PoolWorker-7
Starting PoolWorker-15
C:\Users\schappell\Desktop>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.