【发布时间】:2015-08-26 07:12:25
【问题描述】:
在组合多处理、请求(或 urllib2)和 nltk 时遇到问题。这是一个非常简单的代码:
>>> from multiprocessing import Process
>>> import requests
>>> from pprint import pprint
>>> Process(target=lambda: pprint(
requests.get('https://api.github.com'))).start()
>>> <Response [200]> # this is the response displayed by the call to `pprint`.
关于这段代码的更多细节:
- 导入一些必需的模块
- 启动子进程
- 从子进程向“api.github.com”发出 HTTP GET 请求
- 显示结果
这很好用。导入nltk时出现问题:
>>> import nltk
>>> Process(target=lambda: pprint(
requests.get('https://api.github.com'))).start()
>>> # nothing happens!
在导入 NLTK 之后,请求实际上默默地使线程崩溃(如果您尝试使用命名函数而不是 lambda 函数,在调用前后添加一些 print 语句,您会看到执行停止直接拨打requests.get)
有谁知道 NLTK 中的什么可以解释这种行为,以及如何克服这个问题?
这是我正在使用的版本:
$> python --version
Python 2.7.5
$> pip freeze | grep nltk
nltk==2.0.5
$> pip freeze | grep requests
requests==2.2.1
我正在运行 Mac OS X v. 10.9.5。
谢谢!
【问题讨论】:
-
问题与 SSL 无关,将 github api URL 替换为 'google.com' 不会改变导入/不导入 nltk 的行为。
-
这个问题也与
requests无关。当用req = urllib2.Request('http://google.com'); handler = urllib2.urlopen(req); print handler.getcode()替换对requests.get的调用时,问题仍然存在。 -
将 nltk 升级到最新版本也没有解决问题...
-
尝试在没有多处理的情况下做同样的事情,即在同一个进程中执行它,看看会发生什么。
-
这可行,该问题特定于从子进程发送的请求。此错误已在 2 个月前报告:github.com/nltk/nltk/issues/947。但是,我正在运行的 NLTK 版本已于 2012 年 11 月发布,我很惊讶没有人更早注意到它。
标签: python python-2.7 python-requests nltk python-multiprocessing