我创建了一个(相当大的)程序,需要很长时间才能完成,我开始寻找加速程序的方法。
我发现如果我在程序运行时打开任务管理器,只有一个内核在使用。
经过一番研究,我找到了这个网站:
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/