在Python

时间:2017-05-24 20:21:42

标签: python multiprocessing

我打算在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()

BotProcess文件:

class botProcess(multiprocessing.Process):

    guiProcess = ""

    def run(self):
        # Run Bot

    def someOtherMethod(self):
        # doSomething

GuiProcess文件:

class guiProcess(multiprocessing.Process):

    botProcess = ""

    def run(self):
        # Display GUI
        botProcess.someOtherMethod();

每次我尝试在另一个进程上运行方法时,都会收到以下错误消息:

AttributeError: 'NoneType' object has no attribute 'someOtherMethod'

有没有一种简单的方法可以解决这个问题?或者我应该尝试其他东西(例如线程)而不是多处理?

1 个答案:

答案 0 :(得分:0)

我留下评论为什么我认为你应该使用Threading模块而不是Multiprocessing,但如果你想坚持多处理,我认为你的问题是: 首先,您应该切换变量名称,使它们与您的类不同。

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是类的成员,可以访问它们的实例。之前它们只是局部变量,只能在定义它们的类中使用。