Estoy un poco confundido acerca de cómo escribir código asincrónico en python/twisted. Supongamos (para bien de los argumentos) que estoy exponiendo una función para el mundo, que tendrá un número y devolver True/False si es primo/no preferencial, por lo que parece vagamente a esto:Twisted: Haciendo código no bloqueante
def IsPrime(numberin):
for n in range(2,numberin):
if numberin % n == 0: return(False)
return(True)
(sólo para ilustrar).
Digamos que hay un servidor web que necesita llamar a IsPrime en función de un valor enviado. Esto llevará mucho tiempo para grandes numberin
.
Si mientras tanto otro usuario solicita la primalidad de un número pequeño, ¿hay alguna manera de ejecutar las dos llamadas de función de forma asincrónica utilizando la arquitectura reactor/diferido para que el resultado de la calcificación breve se devuelva antes del resultado de el largo calc?
Entiendo cómo hacer esto si la funcionalidad IsPrime proviene de algún otro servidor web al cual mi servidor web haría un getPage diferido, pero ¿y si solo fuera una función local?
es decir, ¿se puede torcer de alguna manera el tiempo compartido entre las dos llamadas a IsPrime, o requeriría una invocación explícita de un nuevo hilo?
O, ¿el bucle IsPrime necesita ser fragmentado en una serie de bucles más pequeños para que el control pueda pasar rápidamente al reactor?
¿O algo más?
Cuando tiene una función que realmente lleva mucho tiempo, por ej. está "bloqueando", puede usar 'deferToThread()' para ejecutarlo en un hilo: http://twistedmatrix.com/documents/11.0.0/api/twisted.internet.threads.deferToThread.html –
O Twisted's Process soporte: http://twistedmatrix.com/documents/current/core/howto/process.html –
Hah, escribí una [pregunta muy similar] (http://stackoverflow.com/questions/5719782/confusion-about-cpu -intensive-code-in-node-js) para Node.js recientemente. Interesado en ver cuáles son las soluciones en Twisted. – YXD