Python URLLib不适用于PyQt + Multiprocessing

时间:2015-06-13 08:16:11

标签: python pyqt4 python-multiprocessing

一个简单的代码:

import urllib2
import requests

from PyQt4 import QtCore

import multiprocessing
import time

data = (
    ['a', '2'], 
)

def mp_worker((inputs, the_time)):
    r = requests.get('http://www.gpsbasecamp.com/national-parks')
    request = urllib2.Request("http://www.gpsbasecamp.com/national-parks")
    response = urllib2.urlopen(request)

def mp_handler():
    p = multiprocessing.Pool(2)
    p.map(mp_worker, data)

if __name__ == '__main__':
    mp_handler()

基本上,如果我导入PyQt4,并且我有一个urllib请求(我相信这几乎在所有Web提取库中使用,例如BeautifulSoup,Requests或Pyquery。它会在我的MAC上使用神秘的日志崩溃)

2 个答案:

答案 0 :(得分:0)

这是完全正确的。它总是在Mac上失败,我浪费了很多天才解决这个问题。说实话,目前还没有解决方案。最好的方法是使用Thread而不是Process,它将像魅力一样工作。

顺便说一下 -

r = requests.get('http://www.gpsbasecamp.com/national-parks')

request = urllib2.Request("http://www.gpsbasecamp.com/national-parks")
response = urllib2.urlopen(request)

做同一件事。你为什么两次这样做?

答案 1 :(得分:0)

这可能是由于_scproxy.get_proxies()在Mac上不安全。

在这里https://bugs.python.org/issue33725#msg329926

  已知

_scproxy在一段时间内存在问题,请参见例如Issue31818。该问题还提供了一种简单的解决方法:将urllib的“ no_proxy”环境变量设置为“ *”将阻止对系统配置框架的调用。

这是urllib可能试图做的事情,导致多处理时失败。

有一种解决方法,那就是将环境变量no-proxy设置为*

例如。 export no_proxy=*