最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在 Twisted Web 中调用同步方法
时间:2016-08-31 编辑:简简单单 来源:一聚教程网
原来给 Scrapyd 写过一个 小插件 ,希望可以同步等待爬虫的结果,并在接口中返回。
原来的实现是:
class CrawlService(scrapyd.resources.JsonResource):
def render_POST(self, request):
resp = self.DO_SOME_SYNC_OPERATION(request)
return resp
在日志中,发现有大量连续的超时响应,遂发现这个问题。
由于 Twisted 是单线程/事件驱动的,同步调用造成了调度线程被完全堵塞,进而完全无法对外服务。
修复依赖 Twisted 的异步 Response 特性,见 Twisted Developer Guide: Asynchronous Response : 我们需要将实现替换为返回 NOT_DONE_YET , 并在返回前触发一个异步操作,在异步操作中调用 request.write, request.finish。 另外,同步调用应当在额外的线程中执行,见 Twisted Developer Guide: Using Threads in Twisted : 我们需要将同步操作塞到 callInThread 中执行。
修复如下:
class CrawlService(scrapyd.resources.JsonResource):
def render_POST(self, request):
reactor.callInThread(self.DO_SOME_SYNC_OPERATION, request)
return server.NOT_DONE_YET
上段时间写 Tornado 程序,被异步调用蹂躏了一番,这次很容易看出了问题。 修复已经发版到了 pypi 上,最新版本: 0.1.6 。 应该不会再出现同步堵塞Event Loop的问题了.
-
上一个: php多线程并发是怎么实现的
相关文章
- 有道云笔记同步失败如何解决 06-01
- 使用钩子 post-commit触发同步代码 09-02
- 详解Java传统线程同步通信技术 11-17
- golang sync.WaitGroup解决goroutine同步 11-12
- Galaxy S4如何通过Kies将联系人与Outlook同步 10-18
- I9300/GT-I9308如何通过Kies同步outlook中的联系人 05-05