Twisted LoopingCall with blocking function(一种带阻塞功能的扭曲环路呼叫)
本文介绍了一种带阻塞功能的扭曲环路呼叫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个应用程序,它需要轮询数据库以获取可能的配置更改。该应用程序是一个使用Twisted的简单xmlrpc服务器。我尝试使用Twisted的LoopingCall执行轮询,但因为LoopingCall在主线程上运行,所以对db的调用被阻塞。因此,如果数据库调用由于某种原因而变慢,则对xmlrpc服务器的请求必须等待。因此,我尝试在线程中运行LoopingCall,但无法真正使其工作。我的问题是,我应该在线程中运行它吗?如果是,如何?
from twisted.web import xmlrpc, server
from twisted.internet.threads import deferToThread
from twisted.internet import reactor, task
import platform
from time import sleep
r = reactor
class Agent(xmlrpc.XMLRPC):
self.routine()
xmlrpc.XMLRPC.__init__(self)
def xmlrpc_echo(self, x):
"""
Return arg as a simple test that the server is running
"""
return x
def register(self):
"""
Register Agent with db and pick up config
"""
sleep(3) # simulate slow db call
print 'registered with db'
def routine(self):
looping_register = task.LoopingCall(self.register)
looping_register.start(7.0, True)
if __name__ == '__main__':
r.listenTCP(7081, server.Site(Agent()))
print 'Agent is running on "%s"' % platform.node()
r.run()
推荐答案
您应该使用twisted.enterprise.adbapi模块。它将为所有兼容DBAPI 2.0的客户端提供非阻塞API,方法是在线程池中运行它们并向您返回标准延迟:
from twisted.enterprise import adbapi
dbpool = adbapi.ConnectionPool('psycopg2', 'mydb', 'andrew', 'password') # replace psycopg2 with your db client name.
def getAge(user):
return dbpool.runQuery('SELECT age FROM users WHERE name = ?', user)
def printResult(l):
if l:
print l[0][0], "years old"
else:
print "No such user"
getAge("joe").addCallback(printResult)
有关更多信息和示例,请访问官方文档:https://twistedmatrix.com/documents/14.0.0/core/howto/rdbms.html
这篇关于一种带阻塞功能的扭曲环路呼叫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:一种带阻塞功能的扭曲环路呼叫
基础教程推荐
猜你喜欢
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01