首页 > 解决方案 > 将 ProcessPoolExecutor 分配给定义的 cpus 并使用队列进行通信

问题描述

希望你们能帮助我。我进行了很多搜索,但无法找到解决我的问题的方法。

我正在使用 Raspberry 3 B+ 以 2ms 的恒定循环时间与安全 plc 通信。为了满足我的需求,我使用了 Linux 内核的 Preempt-RT 补丁,并使用此链接的精确微秒计时:

如何在 Python 中获取毫秒和微秒分辨率的时间戳

使用 isolcpus 和 taskset 命令,我为我的 pyhton 脚本隔离了两个 cpu,以避免操作系统导致更长的循环时间。通过 Raspberry 的 GPIO 以 2 毫秒的周期时间接收和发送一些位是我的第一个任务,现在工作正常。

第二个任务是读取信息并将信息写入 MySQL 数据库,这不是时间关键的(数据库连接已经正常工作)。因此,我想到了使用一个队列,它可以作为我的快速任务和慢速数据库任务之间的连接。

但是,这是我的问题。如果我使用 Concurrent Future ThreadPoolExecutor,我可以很容易地使用队列,但正如预期的那样,到 2 毫秒的时间完全被破坏了。因此,我想到了使用 ProcessPoolExecutor 来同时使用隔离的 cpu 并将两个任务分成一个 cpu。但是有两个问题我无法解决:

  1. 我想将快速任务分配给一个 cpu,将慢速任务分配给第二个 cpu(两个 cpu 都是隔离的)。我怎样才能做到这一点?

  2. 我需要两个队列(发送、接收)进行通信。我无法找到一种在两个进程之间双向通信的方法。

我还想过使用两个不同的脚本,我可以独立地添加到 CPU 中,但这又是这些脚本之间通信的问题。

有没有办法解决这个问题?顺便说一句,我对 python 完全陌生,希望我能够理解你的想法。;-)

标签: pythonqueueraspberry-pi3concurrent.futureshigh-resolution-time

解决方案


如果以后有人遇到同样的问题:我用 ZeroMQ 在两个独立的脚本之间进行通信解决了这个问题。我使用 Publish/Subscribe Messaging Pattern 建立了双向通信。请参阅:https ://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pubsub.html


推荐阅读