gpt4 book ai didi

python - 通过 Python 和 Eventlet 使用多核

转载 作者:行者123 更新时间:2023-12-02 22:59:24 26 4
gpt4 key购买 nike

我有一个 Python Web 应用程序,其中客户端 ( Ember.js ) 通过 WebSocket 与服务器通信(我正在使用 Flask-SocketIO )。除了 WebSocket 服务器之外,后端还做了两件事值得一提:

当客户端提交图像时,会在数据库中创建其实体,并将 ID 放入图像转换队列中。工作人员抓取它并进行图像转换。之后,worker 将其放入 OCR 队列中,由 OCR 队列工作器处理。

到目前为止一切顺利。 WS 请求在单独的线程中同步处理(Flask-SocketIO 为此使用 Eventlet),而繁重的计算操作异步发生(也在单独的线程中)。

现在的问题是:整个应用程序在 Raspberry Pi 3 上运行。如果我不使用它的 4 个内核,我只有一个主频为 1.2 GHz 的 ARMv8 内核。对于 OCR 来说,这是非常小的力量。所以我决定了解如何在 Python 中使用多核。尽管我读到了 GIL 的问题)我发现了multiprocessing其中表示多处理包提供本地和远程并发,通过使用子进程而不是线程有效地回避全局解释器锁。。正是我想要的。所以我立即更换了

from threading import Thread
thread = Thread(target=heavy_computational_worker_thread)
thread.start()

from multiprocessing import Process
process = Process(target=heavy_computational_worker_thread)
process.start()

队列也需要由多个核心处理,所以我必须改变

from queue import Queue
queue = multiprocessing.Queue()

import multiprocessing
queue = multiprocessing.Queue()

还有。有问题:队列和线程库是 monkey patched由 Eventlet 提供。如果我停止使用 Thread 和 Queue 的猴子补丁版本,并使用 multiprocsssing 中的版本,则由 Eventlet 启动的请求线程在访问队列时将永远阻塞。

现在我的问题:

有什么方法可以让这个应用程序在单独的核心上执行 OCR 和图像转换吗?

如果可能的话,我想继续使用 WebSocket 和 Eventlet。我的优点是进程之间的唯一通信接口(interface)是队列。

我已经有的想法: - 不使用队列的 Python 实现,而是使用 I/O。例如,不同子进程将访问的专用 Redis - 更进一步:将每个队列工作程序作为单独的 Python 进程启动(例如 python3 wsserver | python3 ocrqueue | python3 imgconvqueue)。然后我必须确保自己对队列和数据库的访问是非阻塞的

不过,最好的办法是保留单个进程并使其与多处理一起使用。

提前非常感谢

最佳答案

Eventlet 目前与多处理包不兼容。这项工作有一个 Unresolved 问题:https://github.com/eventlet/eventlet/issues/210 .

我认为适合您的情况的替代方案是使用 Celery 来管理您的队列。 Celery 会启动一个工作进程池,等待主进程通过消息队列提供的任务(RabbitMQ 和 Redis 都支持)。

Celery 工作线程不需要使用 eventlet,只有主服务器需要,因此这可以让他们自由地做任何他们需要做的事情,而不受 eventlet 强加的限制。

如果您有兴趣探索这种方法,我有一个使用它的完整示例:https://github.com/miguelgrinberg/flack .

关于python - 通过 Python 和 Eventlet 使用多核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40058748/

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