botella gevent y roscado: gevent solo se puede utilizar desde un solo hilo

Tengo una aplicación de botella de python, que utiliza hilos. debido al hecho de que estoy usando monkey.patch , los subprocesos estaban bloqueando la ejecución de la aplicación (un cuadro de diálogo activado desde un subproceso estaba bloqueando las rutas de la botella para que no respondiera al cliente, hasta que se cerró).

Una pequeña investigación aquí demostró que debería usar el parche de mono sin intentar parchear el hilo:

# Patch python's threads with greenlets from gevent import monkey monkey.patch_all(thread=False) 

Esto no se bloquea en un ejemplo mínimo que escribí.

Pero plantea estos errores en el uso intensivo de Threads, con métodos como threading.setEvent()
Este es el error que recibo:

 C:\Users\IEUser\downloadloft-localserver>python mainserver.py Exception in thread Thread-1: Traceback (most recent call last): File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 551, in _ _bootstrap_inner self.run() File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 753, in r un self.finished.wait(self.interval) File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 403, in w ait self.__cond.wait(timeout) File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 262, in w ait _sleep(delay) File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p y2.7-win32.egg.tmp\gevent\hub.py", line 79, in sleep switch_result = get_hub().switch() File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p y2.7-win32.egg.tmp\gevent\hub.py", line 135, in get_hub raise NotImplementedError('gevent is only usable from a single thread') NotImplementedError: gevent is only usable from a single thread Bottle v0.12-dev server starting up (using GeventSocketIOServer())... Listening on http://localhost:8080/ Hit Ctrl-C to quit. Exception in thread Thread-2: Traceback (most recent call last): File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 551, in _ _bootstrap_inner self.run() File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 753, in r un self.finished.wait(self.interval) File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 403, in w ait self.__cond.wait(timeout) File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 262, in w ait _sleep(delay) File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p y2.7-win32.egg.tmp\gevent\hub.py", line 79, in sleep switch_result = get_hub().switch() File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p y2.7-win32.egg.tmp\gevent\hub.py", line 135, in get_hub raise NotImplementedError('gevent is only usable from a single thread') NotImplementedError: gevent is only usable from a single thread 

¿Es este un problema conocido con gevent.monkeypatch? ¿Algunas ideas?

Las aplicaciones de botella están roscadas, por lo que no puede usar gevent en ninguna función llamada en rutas de botella.

Para ayudarte, necesito especular por qué usas hilos.

Si es para acelerar el sitio web de su botella, juste use el servidor cherrypy:

 pip install cherrypy 

(o simplemente descargue el directorio cherrypy en su directorio actual, es un servidor Python puro)

A continuación, ejecute su aplicación botella de esta manera:

 bottle.run(server='cherrypy') 

Si es porque desea realizar llamadas no bloqueadas (como recuperar direcciones URL) sin bloquear la respuesta, es bastante fácil hacerlo manualmente:

  • Cree un objeto de cola (es una cola especial que puede llenarse y abrirse entre los hilos).
  • Cree y ejecute un subproceso con un bucle infinito de desvinculación de la cola y realice acciones cada vez.
  • Cuando necesite una llamada no bloqueante, empuje la acción a la cola y lleve una.