gpt4 book ai didi

python - 用于数据库驱动程序的Gevent/Eventlet猴子修补

转载 作者:太空狗 更新时间:2023-10-29 19:36:03 26 4
gpt4 key购买 nike

在完成Gevent/Eventlet猴子修补之后-我可以假设每当DB驱动程序(例如redis-py,pymongo)通过标准库(例如socket)使用IO时,它将是异步的吗?

因此,使用eventlet猴子补丁足以实现例如:eventis应用程序中的redis-py nonblocking吗?

据我所知,如果我关心连接的使用就足够了(例如,为每个greenlet使用不同的连接)。但我想确定。

如果您知道还需要什么,或者如何在Gevent/Eventlet中正确使用数据库驱动程序,请同时输入。

最佳答案

如果满足以下所有条件,则可以假定将对其进行神奇的修补。

  • 您确定I/O是基于标准Python socketeventlet/gevent Monkeypatches的其他东西构建的。没有文件,没有 native (C)套接字对象,等等。
  • 您可以将aggressive=True传递给patch_all(或patch_select),或者您确定该库未使用select或类似的东西。
  • 驱动程序不使用任何(隐式)内部线程。 (如果驱动程序确实在内部使用线程,则patch_thread可以工作,但可能不行。)

  • 如果您不确定,它很容易测试-可能比通读代码并尝试执行起来容易。有一个greenlet可以执行以下操作:
    while True:
    print("running")
    gevent.sleep(0.1)

    然后再运行另一个对数据库运行缓慢的查询。如果是monkeypatched,则循环的greenlet将继续以“运行中”的速度每秒打印10次。如果不是,则在查询中阻止该程序时,循环的greenlet将无法运行。

    那么,如果驱动程序阻塞了该怎么办?

    最简单的解决方案是对数据库查询使用真正的并发线程池。这个想法是您将每个查询(或批处理)作为一个线程池作业触发,并在完成该作业时对 gevent进行绿块阻止。 (在非常简单的情况下,不需要很多并发查询,您可以只为每个查询生成一个 threading.Thread,但通常无法避免这种情况。)

    如果驱动程序执行大量CPU工作(例如,您正在使用运行进程内缓存的东西,甚至运行sqlite之类的整个进程内DBMS),则您希望此线程池实际上在进程之上实现,因为否则GIL可能会阻止您的 greenlets运行。否则(尤其是在关心Windows的情况下),您可能希望使用OS线程。 (但是,这意味着您不能 patch_threads();如果需要这样做,请使用进程。)

    如果您使用的是 eventlet,并且想使用线程,那么有一个内置的简单解决方案 tpool 可能就足够了。如果您使用的是 gevent,或者您需要使用进程,则此方法将无效。不幸的是,在实际的线程对象上阻塞greenlet(不阻塞整个事件循环)在 eventletgevent之间有点不同,并且没有很好的记录,但是 tpool源应该可以为您提供这个想法。除了那部分,其余的只是使用 concurrent.futures (如果需要在2.x或3.1中查看pypi上的 futures )来执行 ThreadPoolExecutorProcessPoolExecutor上的任务。 (或者,如果您愿意,可以直接使用 threadingmultiprocessing而不是使用 futures。)

    Can you explain why I should use OS threads on Windows?



    快速的总结是:如果您坚持使用线程,则几乎可以编写跨平台代码,但是如果要使用流程,则实际上是在为两个不同的平台编写代码。

    首先,阅读 multiprocessing模块的 Programming guidelines(“所有平台”部分和“Windows”部分)。幸运的是,大多数情况下都不会使用数据库包装器。您只需要通过 ProcessPoolExecutor处理流程。而且,无论您是在游标操作级别还是查询级别进行包装,所有参数和返回值都将是可以被腌制的简单类型。尽管如此,这还是您必须要小心的地方,否则就不会成为问题。

    同时,Windows的进程内同步对象的开销非常低,但进程间的同步对象的开销却很高。 (它也具有非常快的线程创建和非常慢的进程创建,但是如果您使用池,那并不重要。)那么,如何处理呢?创建OS线程来等待跨进程同步对象并向Greenlet发信号给我带来了很多乐趣,但是您对乐趣的定义可能会有所不同。

    最后, tpool可以轻松地适应Unix的 ppool,但是在Windows上需要做更多的工作(并且您必须了解Windows才能完成该工作)。

    关于python - 用于数据库驱动程序的Gevent/Eventlet猴子修补,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491400/

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