- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 tornado 实现 REST api,并希望它是非阻塞的。
目前,与问题相关的代码是这样的:
class ReprsHandler(web.RequestHandler):
async def get(self, name):
db = await dbf.create_handler()
if 'id' in list(self.request.query_arguments.keys()):
db_future = asyncio.ensure_future(db.get_repr(name, self.get_query_argument('id')))
else:
db_future = asyncio.ensure_future(db.get_reprs(name))
result = await db_future
response = result.toSerializedStream()
self.set_status(HTTPStatus.OK)
self.write(response)
self.set_header('Content-Type', 'text/plain')
self.finish()
class App(object):
def __init__(self, loop):
self.server_app = web.Application(
handlers=[
(r"/api/v1/([a-zA-Z0-9_-]+)/reprs", ReprsHandler),
]
)
def main():
AsyncIOMainLoop().install()
loop = asyncio.get_event_loop()
app = App(loop)
server = tornado.httpserver.HTTPServer(app.server_app, max_body_size=config['max_upload_size'], max_buffer_size=config['max_upload_size'])
server.bind(config['server_port'])
server.start()
loop.run_forever()
简单的代码,但是数据比较大,所以发送完大概需要3~4分钟。
我希望处理程序的逻辑和网络 IO 都是非阻塞的,但它在发送数据作为响应时阻塞了服务器网络。逻辑很好。它们不会阻止其他请求。
详细信息:
可能是什么问题?我不知道是什么导致了这个问题。
最佳答案
因为您提到 result.toSerializedStream()
会腌制数据。所以,是的,你是对的,阻塞是因为网络 io。
为避免这种情况,您可以在 block 中发送数据并在每次self.write()
之后调用self.flush()
。调用 flush
会将响应写入网络。由于您可以在flush
上await
,在数据写入网络套接字之前,协程将暂停,服务器不会阻塞。这允许其他处理程序异步运行。
代码示例:
async def get(self, name):
...
response = result.toSerializedStream()
chunk_size = 1024 * 1024 * 10 # 10 MiB
start_byte = 0
while True:
chunk = response[start_byte : start_byte + chunk_size]
if not chunk:
break
self.write(chunk)
await self.flush() # wait while data is flushed to network
start_byte += chunk_size # move start_byte forward
重要:
这里要注意的一件重要事情是 self.flush()
非常快。如果您将小数据刷新到网络,await
延迟非常小,协程会不停地运行,从而阻塞服务器。
在上面的示例代码中,我将 chunk_size
设置为 10 MiB
,但是如果您的计算机速度很快,await
延迟将非常非常小,循环可能会不停地运行,直到发送完整个数据。
我鼓励您根据需要增加或减少 chunk_size
值。
进一步改进建议:
所有数据都在内存中。现在您的处理程序是异步的并且不会阻塞,如果在 ReprsHandler
处收到另一个请求,这将导致在内存中存储更多数据。如果收到越来越多的请求,那么您可以判断会发生什么。
为避免这种情况,您可以将其转储到文件中,而不是对内存中的数据进行酸洗。然后在您的处理程序中,只需打开
该文件并分块读取并发送。
关于python Tornado 处理程序 IO 阻塞整个服务器网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47745524/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!