Python多处理过程不运行

时间:2014-02-23 18:20:41

标签: python python-3.x multiprocessing

首先,应该提到的是我对编程很新,而且我使用的是Python 3.2.5。我正在尝试创建一个定期连接和ping服务器的游戏。起初,我试图简单地将其直接捆绑到游戏的主循环中,结果是所述循环​​在ping的持续时间内冻结(我的连接很慢,我不希望这会抑制游戏玩法,因为游戏不会t依赖于服务器 - 它只需要ping它以保持会话打开,以便以后注册最终得分。)

说到这一点,我想我会尝试使用辅助循环来处理所有与服务器相关的代码,这使我进行了多处理。我目前的想法是保持无限循环运行,并通过队列向其提供任务。然后它将返回信息,表示任务是否成功通过队列,游戏可以顺利运行。我将它剥离到下面进行测试,没有任何内容被打印出来。我显然想知道为什么。

(我猜很多聪明的人对于如何做到这一点有更好的想法。我都是耳朵。)

import multiprocessing

def aFunction(q_in, q_out):
    while True:
        item = q_in.get()
        q_out.put("some info")

if __name__ == "__main__":
    q_in = multiprocessing.Queue()
    q_out = multiprocessing.Queue()
    p = multiprocessing.Process(target = aFunction, args = (q_in, q_out))

    p.start()
    q_in.put("some task here")

    while True:
        item = q_out.get()
        print(str(item))

1 个答案:

答案 0 :(得分:0)

当用户User发表评论时,您并未在行empty中调用while q_out.empty == False方法,而是仅引用它。您需要添加一组括号才能调用它:while q_out.empty() == False

该问题导致您的主要流程永远不会尝试get来自您的工作流程的任何回复,这可能就是您在测试中没有看到打印结果的原因。

实际上,在您编辑上述内容时,可以进行样式改进:使用not而不是== Falsewhile not q_out.empty()

另一种风格建议是使用if items而不是if len(items) > 0。如果您知道项目是一个集合,它们具有相同的含义。

或者,您可以将循环删除到一次只处理一个项目,没有列表或检查队列是否为空:

while True:
    item = q_out.get() # this will block until another item is available
    # do stuff with that single item here

如果您需要将多个相关项目一起传递,请使用tuple或列表,而不是按顺序传递它们(这不能保证它们将被一起接收,而不是在两次传递之间分开工人进程)。