【发布时间】:2017-02-21 16:04:20
【问题描述】:
我正在学习 QRunnable,我有以下代码:
from PyQt5.QtCore import QThreadPool, QRunnable
class SomeObjectToDoComplicatedStuff(QRunnable):
def __init__(self, name):
QRunnable.__init__(self)
self.name = name
def run(self):
print('running', self.name)
a = 10
b = 30
c = 0
for i in range(5000000):
c += a**b
print('done', self.name)
pool = QThreadPool.globalInstance()
pool.setMaxThreadCount(10)
batch_size = 100
workers = [None] * batch_size
for i in range(batch_size):
worker = SomeObjectToDoComplicatedStuff('object ' + str(i))
workers[i] = worker
pool.start(worker)
print('All cued')
pool.waitForDone()
# processing the results back
for i in range(batch_size):
print(workers[i].name, ' - examining again.')
我看到确实有不同的进程在交替进行,但是所有都发生在一个内核上。
如何让这段代码使用所有处理器内核运行?
PS:这段代码只是我正在制作的一个超级复杂的数字运算应用程序的简化。在其中,我想在多个线程中进行 Monte Carlo,而 worker 本身就是一个复杂的优化问题。 我已经尝试过 python 多处理模块,但它不能很好地处理 scipy。
【问题讨论】:
-
GIL.
-
我完全了解 GIL,但问题仍然是如何使其在多个内核中运行。
-
这似乎是一个矛盾。如果相关代码未发布 GIL,则不可能使您问题中的代码行为有任何不同。多处理模块正是因为这个问题而存在。因此,如果您不能使用它,则必须编写一个无需 GIL 即可运行代码的扩展。请参阅:Overcoming Python's GIL with Cython。
-
如果你能提供一个使用scipy和多处理模块的解决方案,我会标记为解决方案
-
我以为你尝试过多处理?你遇到了什么具体问题?如果您发布一个 minimal reproducible example 来说明问题,那将非常有帮助。
标签: multithreading python-3.x pyqt5