python - 在多核上运行 Python

标签 python python-3.x multiprocessing

我创建了一个(相当大的)程序,需要很长时间才能完成,我开始寻找加速程序的方法。

我发现如果我在程序运行时打开任务管理器,只有一个内核在使用。

经过一番研究,我找到了这个网站: Why does multiprocessing use only a single core after I import numpy?它给出了 os.system("taskset -p 0xff %d"% os.getpid()) 的解决方案, 但这对我不起作用,我的程序继续在单个内核上运行。

然后我发现了这个: is python capable of running on multiple cores? , 这指向使用多处理。

所以在研究了多处理之后,我看到了这部关于如何使用它的纪录片 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__': 代码块。因此,它是一个模块级常量,在首次加载模块时分配,并将在模块中的任何代码运行之前执行。

要回答第一个问题,您只创建了一个运行的进程,然后等待完成再继续。这使您的多处理 yield 为零,并会产生创建新进程的开销。

因为要创建多个进程,所以需要通过某种集合(例如 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 后立即加入它们,您将等待每个 worker 完成其任务,然后再启动下一个 worker。这通常是不可取的,除非任务的顺序必须是连续的。

通常是错误的

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.

更多信息,请引用以下链接:

关于python - 在多核上运行 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887641/

相关文章:

python - 可迭代的连续切片

python - 使用 python 多进程时在 (CLOSE, TERMINATE) 中断言 self._state

python - 在python中用范围随机数初始化矩阵

python - 按两个字段对 Python 列表进行排序

python - 子类化并重写 PySide2 小部件方法;我在哪里可以找到引用资料?

c++ - 装修调度系统

Visual Studio 的 Python 工具在子进程中设置断点

Python:删除 x 天前的 mySQL 行

Python argparse : name parameters

python - 同一列的多个副本到新数据框中