Python:多处理和请求

时间:2015-05-26 08:19:10

标签: python python-2.7

以下是我运行的代码片段,它使用多处理并行触发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()

3 个答案:

答案 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

希望这也能解决你的问题。