繁体   English   中英

Python多处理进程无法运行

[英]Python multiprocessing process doesn't run

首先,应该提到我是编程的新手,并且我正在使用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))

正如用户User所评论的那样,您没有while q_out.empty == False的那一行中调用empty方法,只是在引用它。 您需要添加一组括号以使其成为调用: 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或列表,而不要顺序传递它们(不能保证将它们一起接收,而不是在工作进程的两次传递中分开)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM