当前位置: 首页 > 面试题库 >

如何将python asyncio与线程结合在一起?

洪华皓
2023-03-14
问题内容

我已经使用Python
asyncio和aiohttp成功构建了一个RESTful微服务,该服务可侦听POST事件以收集来自各种供料器的实时事件。

然后,它构建一个内存结构,以将事件的最后24小时缓存在嵌套的defaultdict / deque结构中。

现在,我想定期检查该结构到磁盘的位置,最好使用pickle。

由于内存结构可以大于100MB,因此我希望避免在检查点结构所需的时间上占用传入事件处理时间。

我宁愿为该结构创建快照副本(例如,Deepcopy),然后花点时间将其写入磁盘并按预设的时间间隔重复执行。

我一直在寻找有关如何组合线程的示例(并且线程是否是为此的最佳解决方案?)和异步用于此目的,但是找不到对我有用的东西。

非常感谢任何入门的指点!


问题答案:

使用以下方法将方法委派给线程或子流程非常简单BaseEventLoop.run_in_executor

import asyncio
import time
from concurrent.futures import ProcessPoolExecutor

def cpu_bound_operation(x):
    time.sleep(x) # This is some operation that is CPU-bound

@asyncio.coroutine
def main():
    # Run cpu_bound_operation in the ProcessPoolExecutor
    # This will make your coroutine block, but won't block
    # the event loop; other coroutines can run in meantime.
    yield from loop.run_in_executor(p, cpu_bound_operation, 5)


loop = asyncio.get_event_loop()
p = ProcessPoolExecutor(2) # Create a ProcessPool with 2 processes
loop.run_until_complete(main())

至于使用aProcessPoolExecutor还是ThreadPoolExecutor,这很难说。腌制一个大物体肯定会消耗一些CPU周期,最初您会认为这ProcessPoolExecutor是可行的方法。但是,将100MB对象传递到Process池中的a将需要在主进程中腌制该实例,通过IPC将字节发送到子进程,在子进程中将其取消腌制,然后
再次
进行腌制,以便可以将其写入磁盘。鉴于此,我的猜测是,酸洗/去酸洗的开销将足够大ThreadPoolExecutor,即使使用GIL会对性能造成负面影响,您也最好使用。

也就是说,两种方法的测试都非常简单,并且可以确定找出来,所以您也可以这样做。



 类似资料:
  • 问题内容: 如何创建使芹菜任务看起来像的包装器?还是有更好的方法与Celery集成? Celery的创建者@asksol这样说: 将Celery用作异步I / O框架之上的分布式层是很常见的(提示:将CPU绑定的任务路由到prefork worker意味着它们不会阻塞事件循环)。 但是我找不到任何专门针对框架的代码示例。 问题答案: 如官方网站上所述,这可以通过Celery 5.0版实现: htt

  • 问题内容: 如何将2个查询的结果按日期排序? table1,table2具有相同的字段: PS:顺便说一句,标签是 问题答案: 您可以用来从两个表中获取行: 您可能还需要考虑重组数据库,以便代替使用两个表,而只使用一个表和一个字段来区分每一行的类型。然后,查询可以简化为:

  • 我正在学习使用RxAndroid库的RxJava,同时使用改型来进行联网,并使用RetroLambda来使用Java8 lambdas。 我希望构建的应用程序具有以下功能: 允许用户键入对Wikipedia API的查询 我让它像这样工作: 现在,我想添加一个新的小部件,允许我的维基百科查询使用另一种语言。现在,我将选择一个开关,以“en”或“nl”作为维基百科url的前缀。 所以我从开关中创建了

  • 我运行一个大型的minecraft服务器,minecraft服务器端是单线程的。一切都是在主游戏循环中完成的。如果Mojang使minecraft服务器端多线程化,minecraft服务器每年将节省200万美元,因为租用的硬件更少。 不管怎样,我听说过这些谣言和理论。我从来都无法用谷歌搜索并弄清楚。 有没有必要使用多核cpu,并将其转换为单核、单线程? 我一直在猜测虚拟机管理程序软件将运行多线程,

  • 我正在使用springbootersey进行web restful实现。现在我要将swagger集成到我们的应用程序中。我做了以下操作。 我添加了以下对build.gradle的依赖: 我能够启动这个web应用程序,但我想知道哪个url是用来招摇的?我试过了http://localhost:8080, http://localhost:8080/swagger和http://localhost:8

  • 问题内容: 我有3个查询已经达到我的SQL知识(如果重要的话,Microsoft SQL 2005)的顶峰-现在​​我需要将它们组合成一个查询,并将所有值都放在一行中。 我的实际查询如下,但是我认为如果在此处提供一个简单的版本会更容易: 查询一: 查询一个样本输出: 查询二: 查询两个样本输出: 查询三: 查询三个样本输出: 我曾尝试通过父SELECT语句(其中包括此Web链接的详细信息,并为每个