我在组合多处理,请求(或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.
谢谢!
更新你的python库和python应该可以解决这个问题:
alvas@ubi:~$ pip freeze | grep nltk
nltk==3.0.3
alvas@ubi:~$ pip freeze | grep requests
requests==2.7.0
alvas@ubi:~$ python --version
Python 2.7.6
alvas@ubi:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.2 LTS
Release: 14.04
Codename: trusty
从代码:from multiprocessing import Process
import nltk
import time
def child_fn():
print "Fetch URL"
import urllib2
print urllib2.urlopen("https://www.google.com").read()[:100]
print "Done"
while True:
child_process = Process(target=child_fn)
child_process.start()
child_process.join()
print "Child process returned"
time.sleep(1)
[出]:
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
Fetch URL
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta content
Done
Child process returned
从代码:alvas@ubi:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import Process
>>> import requests
>>> from pprint import pprint
>>> Process(target=lambda: pprint(
... requests.get('https://api.github.com'))).start()
>>> <Response [200]>
>>> import nltk
>>> Process(target=lambda: pprint(
... requests.get('https://api.github.com'))).start()
>>> <Response [200]>
它应该也适用于python3
:
alvas@ubi:~$ python3
Python 3.4.0 (default, Jun 19 2015, 14:20:21)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import Process
>>> import requests
>>> Process(target=lambda: print(requests.get('https://api.github.com'))).start()
>>>
>>> <Response [200]>
>>> import nltk
>>> Process(target=lambda: print(requests.get('https://api.github.com'))).start()
>>> <Response [200]>
在子进程中使用Nltk和Python请求似乎很少见。尝试使用线程而不是进程,我与其他一些库和请求有完全相同的问题,并将进程替换为线程为我工作。
这个问题似乎还没有解决。https://github.com/nltk/nltk/issues/947我认为这是一个严重的问题(除非你正在玩NLTK,做POCs和尝试模型,而不是实际的应用程序)我正在RQ worker中运行NLP管道(http://python-rq.org/)
nltk==3.2.1
requests==2.9.1