我计划在Python中为 Twitch.tv 创建一个聊天机器人。我喜欢为不同的主要功能使用多个进程(一个用于机器人本身,一个用于 GUI)。每个进程都应该以内部变量的形式引用其他进程。我还没有开始对机器人本身进行编码,但我用一个小例子测试了多处理。
主文件:
from BotProcess import botProcess
from GuiProcess import guiProcess
botProcess = botProcess()
guiProcess = guiProcess()
botProcess.guiProcess = guiProcess
guiProcess.botProcess = botProcess
botProcess = botProcess()
guiProcess = guiProcess()
botProcess.guiProcess = guiProcess
guiProcess.botProcess = botProcess
botProcess.start()
guiProcess.start()
机器人进程文件:
class botProcess(multiprocessing.Process):
guiProcess = ""
def run(self):
# Run Bot
def someOtherMethod(self):
# doSomething
贵进程文件:
class guiProcess(multiprocessing.Process):
botProcess = ""
def run(self):
# Display GUI
botProcess.someOtherMethod();
每次我尝试在另一个进程上运行方法时,都会收到以下错误消息:
AttributeError: 'NoneType' object has no attribute 'someOtherMethod'
有没有简单的方法可以解决这个问题?还是我应该尝试其他方法(例如线程)而不是多处理?
我留下了为什么我认为你应该使用线程模块而不是多处理的评论,但如果你想坚持多处理,我认为你的问题是: 首先,您应该切换变量名称,使它们与您的类不同。
bot_process = botProcess()
使用好的变量名不仅可以帮助其他人阅读您的代码,还可以避免任何意外的运行时和语法错误。 第二,这样做:
botProcess = botProcess()
guiProcess = guiProcess()
botProcess.guiProcess = guiProcess
guiProcess.botProcess = botProcess
botProcess = botProcess()
guiProcess = guiProcess()
botProcess.guiProcess = guiProcess
guiProcess.botProcess = botProcess
是多余的。你只是将相同的变量分配给相同的事物两次。
第三,可能你真正想要的是,你的类中的东西不是成员,这可能是你想要的。这是你应该拥有的:
class guiProcess(multiprocessing.Process):
def __init__(self):
self.other_bot_process = None
def run(self):
# Display GUI
self.other_bot_process.someOtherMethod();
(同样在另一类中) 然后在主文件中:
bot_process = botProcess()
gui_process = guiProcess()
bot_process.other_gui_process = gui_process
gui_process.other_bot_process = bot_process
现在,other_gui_process和other_bot_process是类的成员,可以访问它们的实例。以前它们只是局部变量,只能在定义它们的类中使用。