gpt4 book ai didi

python - 如何在 tornado python 中创建异步 RequestHandler

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:39 26 4
gpt4 key购买 nike

目前我正在使用 tornado 开发我的后端网络服务器。

我现在遇到的问题:
- 当发出请求并且服务器正在处理请求时,所有其他请求都被阻止

我的请求处理程序:

class UpdateServicesRequestHandler( RequestHandler ):

@gen.coroutine
def get( self ):

update = ServiceUpdate()
response = yield update.update_all( )

if self.request.headers.get('Origin'):
self.set_header( 'Access-Control-Allow-Origin', self.request.headers.get('Origin') )
self.set_header( 'Content-Type', 'application/json')
self.write( response )

我的update_all():

@gen.coroutine
def update_all( self ):

for service in self.port_list:
response = yield self.update_service( str( service.get( 'port' ) ) )
self.response_list.append( response )

self.response = json.dumps( self.response_list )

return self.response

我的update_sevice():

process = Popen( [ command ], stdout=PIPE, stderr=PIPE, shell=True )
output, error = process.communicate()

问题是,我需要 update_all() 方法的结果。那么有没有可能让这个请求不阻止我的整个服务器请求?

谢谢!

最佳答案

除了按照 dano 的建议使用 tornado.process.Subprocess 之外,您还应该使用 stdout=tornado.process.Subprocess.STREAM 而不是 PIPE,并从 stdout/stderr 异步读取。使用 PIPE 将适用于少量输出,但如果您使用 PIPE 并且子进程也尝试写入,您将在 wait_for_exit() 中死锁很多数据(以前是 4KB,但在大多数现代 linux 系统中限制更高)。

process = Subprocess([command], 
stdout=Subprocess.STREAM, stderr=Subprocess.STREAM,
shell=True)
out, err = yield [process.stdout.read_until_close(),
process.stderr.read_until_close()]

关于python - 如何在 tornado python 中创建异步 RequestHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com