首先,应该提到的是我对编程很新,而且我使用的是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))
答案 0 :(得分:0)
当用户User发表评论时,您并未在行empty
中调用while q_out.empty == False
方法,而是仅引用它。您需要添加一组括号才能调用它:while q_out.empty() == False
该问题导致您的主要流程永远不会尝试get
来自您的工作流程的任何回复,这可能就是您在测试中没有看到打印结果的原因。
实际上,在您编辑上述内容时,可以进行样式改进:使用not
而不是== False
:while 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
或列表,而不是按顺序传递它们(这不能保证它们将被一起接收,而不是在两次传递之间分开工人进程)。