繁体   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