我在wsgi容器中的twisted上运行django。显然,我正在避免在我的django代码中使用deferreds的所有异步功能,因为根据文档,扭曲的异步功能在WSGI应用程序中是不允许的。
但是,我想在我的WSGI应用程序中使用twisted.words向jabber服务器发送请求。这算不算异步的东西,或者我可以在我的应用程序中使用它?如果我将xmpp请求发送到twisted.words中的xmpp服务器,会发生什么情况?
此外,我还有一个更一般的问题。twisted的WSGI容器是多线程的(它是多线程的吗?)众所周知,python的GIL只会降低带有线程的脚本的整体性能。
感谢您的回复。
发布于 2011-10-30 09:22:36
要从另一个线程(非I/O线程,即WSGI应用程序线程)调用Twisted中的主事件循环(I/O线程)中的函数,您可以使用reactor.callFromThread()。如果你想等待结果,那就使用threads.blockingCallFromThread()。因此,您可以调用使用twisted.words的函数,请参见Using Threads in Twisted。
要确定wsgi容器是否是多线程的,请检查wsgi.multithread,它应该为扭曲的容器返回true。
WSGI容器是多线程的,可以同时支持多个请求(这并不是必须的,但它使使用现有软件变得更容易)。否则(如果您不使用其他方法来解决此问题),当您的请求处理程序等待来自数据库的应答时,整个服务器将阻塞。有些人发现,如果没有太多并发请求,编写请求处理程序会更简单,而不会担心阻塞其他请求。
当性能问题时,Python中执行CPU密集型作业的函数可以使用在计算期间释放GIL的库,或者将它们卸载到其他进程。webapps中频繁出现的网络、磁盘I/O通常比CPU慢得多。
https://stackoverflow.com/questions/7938112
复制相似问题