2012-05-03 2 views
4

Пожалуйста, проверьте этот питон код:Странные проблемы при использовании запросов и мультипроцессорных

#!/usr/bin/env python 
import requests 
import multiprocessing 
from time import sleep, time 
from requests import async 

def do_req(): 
    r = requests.get("http://w3c.org/") 

def do_sth():  
    while True: 
     sleep(10) 

if __name__ == '__main__':   
    do_req() 
    multiprocessing.Process(target=do_sth, args=()).start() 

При нажатии Ctrl-C (подождите 2 секунды после запуска - пусть приработки), он не останавливается. Когда я меняю импортный заказ на:

from requests import async 
from time import sleep, time 

останавливается после Ctrl-C. Почему это не останавливается/убивает в первом примере?

Это ошибка или функция?

Примечание:

  • Да, я знаю, что я не использовал асинхр в этом коде, это просто урезанный код. В реальном коде я использую его. Я сделал это, чтобы упростить свой вопрос.
  • После нажатия Ctrl-C выполняется новый (дочерний) процесс. Зачем?
  • multiprocessing.__version__ == 0.70a1, requests.__version__ == 0.11.2, gevent.__version__ == 0.13.7
+0

Возможно, вы перезаписываете некоторые имена модулей или функций (время?). Попытайтесь прекратить использование «from .. import ..» и используйте полные имена, такие как «time.time()», возможно, это решает вашу проблему (не пробовал сам) – snies

ответ

6

просит модуль асинхронной использует GEvent. Если вы посмотрите на исходный код GEvent вы увидите, что она monkey patches многие из функций стандартной библиотеки Python, включая сон: модуль

request.async во время импорта выполняет:

from gevent import monkey as curious_george 
    # Monkey-patch. 
    curious_george.patch_all(thread=False, select=False) 

Глядя на monkey.py модуль GEvent вы можете увидеть:

https://bitbucket.org/denis/gevent/src/f838056c793d/gevent/monkey.py#cl-128

def patch_time(): 
    """Replace :func:`time.sleep` with :func:`gevent.sleep`.""" 
    from gevent.hub import sleep 
    import time 
    patch_item(time, 'sleep', sleep) 

Взгляните на код из reposito в GEvent в ry для деталей.

+0

Yup, только что пришел к этому коду. И поскольку @neutrinus импортирует сон с момента до импорта async в случае 1, он собирается пропустить этот патч, где он просто использует сон вместо time.sleep – snies

+0

Спасибо за полное объяснение. Поскольку это похоже на проблему с gevent patching ... Я обновил версию gevent версии 1.0 и работал (они перешли на libev вместо libevent). Эта версия должна быть в pypi btw ... – neutrinus

Смежные вопросы