以下是我运行的代码片段,它使用多处理并行触发HTTP请求。在控制台上运行之后,它会挂起“requests.get(url)”并且既没有继续前进也没有抛出错误。
def echo_100(q):
...
print "before"
r = requests.get(url)
print "after"
...
q.put(r)
q = multiprocessing.Queue()
p = multiprocessing.Process(target=echo_100,args=(q))
p.start()
p.join()
resp = q.get()
答案 0 :(得分:5)
在Mac OS上,似乎有一些错误从操作系统读取代理设置。我不知道确切的细节,但有时会导致请求在使用多处理时挂起。您可以尝试通过完全禁用操作系统代理来解决问题,如下所示:
session = requests.Session()
session.trust_env = False # Don't read proxy settings from OS
r = session.get(url)
为我修好了。
答案 1 :(得分:0)
如果你没有清理队列,我的意思是不要将项目从队列中取出,过程会在一段时间后挂起。多处理队列由Linux平台上的未命名FIFO(管道)支持。管道的最大尺寸限制。这意味着,如果进程写入管道而没有其他进程正在从管道读取数据,则在一段时间之后写入过程将在尝试将更多数据添加到管道时挂起(它可能在内部挂起写入系统调用)。
我怀疑,你没有从队列中获取项目,因此队列在一段时间后变满,导致后续的子进程停滞。
现在,如果子进程挂起,那么如果父进程尝试加入(p.join())子进程(在内部它将调用waitpid以加入子进程),则父进程也可能会挂起。
答案 2 :(得分:0)
我有一个完全相同的问题。我发现在我的所有模块中删除import ipdb
次调用都解决了这个问题。我不确定为什么导入导致了这个问题,但是消除那些导入完全修复了它。仅仅导入导致问题,我甚至没有使用ipdb
包中的任何内容。
更新:这在Python 2.7.10和3.5.0上都会发生,并且仅在我导入ipdb
时才会发生。如果您导入pdb
,一切都会好起来的。我发布了一个相关问题,询问为什么会发生这种情况here
希望这也能解决你的问题。