gpt4 book ai didi

python - 使用动态加载的函数作为 multiprocessing.Pool 的目标

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:34 30 4
gpt4 key购买 nike

我正在开发一个 GUI,它需要在后台进行一些繁重的计算,然后在计算完成后更新 GUI。多处理模块似乎是一个很好的解决方案,因为我可以使用 *apply_async* 方法来指定目标和回调函数。回调函数用于使用结果更新 GUI。然而,当我尝试将多处理与动态加载的模块结合起来时,我遇到了困难,如以下代码所示。错误消息为 ImportError:没有名为 calc 的模块。

该错误是由于多重处理不适用于动态加载的模块吗?如果没有,有更好的方法吗?

from PySide.QtCore import *
from PySide.QtGui import *
import multiprocessing
import time
import sys
import os
import logging
import imp

PluginFolder = "plugins"
plugins = {}

def f(x):
y = x*x
time.sleep(2) #Simulate processing time.
return y


def load_plugin(name):
'''Load the python module 'name'
'''
location = os.path.join('.', PluginFolder)
info = imp.find_module(name, [location])
plugin = {"name": name, "info": info}
plugins[name] = imp.load_module(name, *plugin["info"])


class MainWindow(QMainWindow):

def __init__(self):
super(MainWindow, self).__init__()
self.pool = multiprocessing.Pool()
load_plugin('calc') #load ./plugins/calc.py

button1 = QPushButton('Calculate', self)
button1.clicked.connect(self.calculate)
button2 = QPushButton('Test', self)
button2.clicked.connect(self.run_test)
self.text = QTextEdit()

vbox1 = QVBoxLayout()
vbox1.addWidget(button1)
vbox1.addWidget(button2)
vbox1.addWidget(self.text)
myframe = QFrame()
myframe.setLayout(vbox1)

self.setCentralWidget(myframe)
self.show()
self.raise_()



def calculate(self):
#self.pool.apply_async(f, [10], callback=self.update_gui) #This works

#result = plugins['calc'].f(10) #this works
#self.update_gui(result)

self.pool.apply_async(plugins['calc'].f, [10], callback=self.update_gui) #This doesn't


def update_gui(self, result):
self.text.append('Calculation complete. Result = %d\n' % result)


def run_test(self):
self.text.append('Testing\n')


if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MainWindow()
app.exec_()

在./plugins/calc.py中,函数f的定义如上面的代码所示。

最佳答案

这不起作用,因为您正在加载 calc模块作为顶级模块。由于没有模块calc存在于您的 sys.path 中或者在当前目录中,通过 import 语句找不到它。用以下替换 import 语句即可解决问题:

plugins[name] = imp.load_module('{}.{}'.format(PluginFolder, name), 
*plugin["info"])

对于plugin.calc可导入,plugins必须是一个 python 模块,即包含 __init__.py文件。

任何 import <module>插件文件中的声明,例如 plugins/calc.py ,将导致警告,

RuntimeWarning: Parent module 'plugins' not found while handling absolute import import <module>

原因是导入过程会查找父模块是否包含 <module> ,并且在里面 calc.py ,找不到父项plugins模块。您可以明确指定 plugins 来消除错误模块位置,例如 import plugins主代码中的语句。

关于python - 使用动态加载的函数作为 multiprocessing.Pool 的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216809/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com