Python多处理进程不';跑不动

Python多处理进程不';跑不动,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,首先,应该提到的是,我对编程相当陌生,而且我使用的是Python 3.2.5。我正在尝试创建一个定期连接并ping服务器的游戏。起初,我试图简单地将其捆绑到游戏的主循环中,结果,在ping期间,所述循环冻结(我的连接很慢,我不希望这会抑制游戏性,因为游戏根本不依赖于服务器-它只需要ping它以保持会话打开,以便稍后注册最终分数) 说到点子上,我想我应该尝试对所有与服务器相关的代码使用一个二级循环,这让我想到了多处理。我目前的想法是保持无限循环运行,并通过队列向其提供任务。然后,它会通过队列返回任

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

说到点子上,我想我应该尝试对所有与服务器相关的代码使用一个二级循环,这让我想到了多处理。我目前的想法是保持无限循环运行,并通过队列向其提供任务。然后,它会通过队列返回任务是否成功的信息,游戏可以顺利运行。为了测试,我将其精简为以下内容,但没有打印任何内容。我显然想知道为什么

(我猜很多聪明人对如何做到这一点有更好的想法。我洗耳恭听。)

正如用户所评论的,您没有调用行
中的
empty
方法,而q_out.empty==False
,您只是在引用它。您需要添加一组括号以使其成为调用:
while q_out.empty()==False

该问题导致您的主进程从未尝试从工作进程中获取任何回复,这可能就是您在测试中看不到打印结果的原因

实际上,在编辑上面这行的时候,有一个风格上的改进:使用
not
而不是
==False
而不是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

如果需要同时传递多个相关项,请使用
元组或列表,而不是按顺序传递它们(这不能保证它们将一起接收,而不是在工作进程中分为两次传递)。

编辑了OP以解释我对这些项的想法。我对@User有很多误解,看起来是这样。不管怎样,这都很好而且很有帮助(相应地修改了OP),但我仍然没有得到任何打印输出。我测试了您当前在问题中的代码,它按照我的预期打印了
“一些信息”
。它确实会永远运行,但这并不是多处理代码中的一个真正的缺陷,它只是通过队列发送一个项目,然后在两个队列都为空时死锁。如果你的主循环还有其他事情要做,你可以在不退出q_out.empty()
循环的情况下带回
,或者做一个非阻塞
get
来避免这种情况。该死的,你是对的。我会称之为机器中的幽灵,因为我可以发誓它以前没有打印任何东西。无论如何,问题解决了,非常感谢。使用Python 2.7.5不会因为调用
q\u out.get()
而停止进程进一步执行吗?
while True:
    item = q_out.get() # this will block until another item is available
    # do stuff with that single item here