/ Problemas estranhos ao usar pedidos e multiprocessamento - python, linux, multiprocessamento, kill, python-orders

Problemas estranhos ao usar solicitações e multiprocessamento - python, linux, multiprocessamento, kill, python-requests

Por favor, verifique este código python:

#!/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()

Quando pressiono Ctrl-C (aguarde 2 segundos após a execução - deixe o Process executar), ele não para. Quando altero a ordem de importação para:

from requests import async
from time import sleep, time

para após Ctrl-C. Por que não para / mata no primeiro exemplo?

É um bug ou um recurso?

Notas:

  • Sim, eu sei, que eu não usei assíncrono neste código, isso é apenas um código simplificado. No código real, eu o uso. Fiz isso para simplificar minha pergunta.
  • Depois de pressionar Ctrl-C, há um novo processo (filho) em execução. Por quê?
  • multiprocessing.__version__ == 0.70a1, requests.__version__ == 0.11.2, gevent.__version__ == 0.13.7

Respostas:

6 para resposta № 1

Solicita que o módulo assíncrono use gevent. Se você olhar o código fonte do gevent, verá que ele manchas de macaco muitas das funções de biblioteca padrão do Python, incluindo sleep:

O módulo request.async durante a importação é executado:

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

Observando o módulo monkey.py do gevent, você pode ver:

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)

Dê uma olhada no código do repositório do gevent para obter detalhes.