簡體   English   中英

在多個核心上運行Python

[英]Running Python on multiple cores

我已經創建了一個(相當大的)程序,需要很長時間才能完成,我開始研究加速程序的方法。

我發現如果我在程序運行時打開任務管理器,則只使用一個核心。

經過一些研究,我找到了這個網站: 為什么多重處理在導入numpy后只使用一個核心? 它提供了os.system("taskset -p 0xff %d" % os.getpid())的解決方案os.system("taskset -p 0xff %d" % os.getpid()) ,但這對我不起作用,我的程序繼續在單核上運行。

然后我發現這個: python是否能夠在多個內核上運行? ,指向使用多處理。

因此,在研究了多處理之后,我遇到了關於如何使用它的紀錄片https://docs.python.org/3/library/multiprocessing.html#examples

我試過這段代碼:

from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

a = input("Finished")

運行代碼后(不是在IDLE中)它說:

Finished
hello bob
Finished

注意:說完之后我第一次按下回車

所以在此之后我現在更加困惑,我有兩個問題

第一:它仍然沒有多核運行(我有一個8核Intel i7)

第二:為什么在它甚至運行if語句代碼之前輸入“Finished”(它甚至還沒有完成!)

要先回答第二個問題,“完成”將打印到終端,因為a = input("Finished")超出了if __name__ == '__main__':代碼塊。 因此,它是一個模塊級常量,在模塊首次加載時分配,並在模塊中的任何代碼運行之前執行。

要回答第一個問題,您只創建了一個運行的進程,然后等待完成再繼續。 這使您無法獲得多處理的好處,並且會產生創建新流程的開銷。

因為您要創建多個進程,所以需要通過某種集合(例如python列表)創建池,然后啟動所有進程。

在實踐中,您需要關注的不僅僅是處理器的數量(例如可用內存量,重新啟動崩潰的工作人員的能力等)。 但是,這是一個完成上述任務的簡單示例。

import datetime as dt
from multiprocessing import Process, current_process
import sys

def f(name):
    print('{}: hello {} from {}'.format(
        dt.datetime.now(), name, current_process().name))
    sys.stdout.flush()

if __name__ == '__main__':
    worker_count = 8
    worker_pool = []
    for _ in range(worker_count):
        p = Process(target=f, args=('bob',))
        p.start()
        worker_pool.append(p)
    for p in worker_pool:
        p.join()  # Wait for all of the workers to finish.

    # Allow time to view results before program terminates.
    a = input("Finished")  # raw_input(...) in Python 2.

另請注意,如果您在啟動工作人員后立即加入工作人員,那么您在等待每個工作人員完成其任務之后再啟動下一個工作人員。 除非任務的順序必須是順序的,否則這通常是不合需要的。

通常是錯的

worker_1.start()
worker_1.join()

worker_2.start()  # Must wait for worker_1 to complete before starting worker_2.
worker_2.join()

通常是渴望的

worker_1.start()
worker_2.start()  # Start all workers.

worker_1.join()
worker_2.join()   # Wait for all workers to finish.

有關更多信息,請參閱以下鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM