我想创建一个小型 p2p 应用程序,它同时处理来自其他已知/受信任节点的传入数据(它主要将其存储在 SQLite 数据库中)。为了识别这些节点,在连接时,每个节点都会自我介绍,然后我的应用程序需要检查它是直接知道这个节点还是通过另一个节点间接知道这个节点。因此,我需要进行图形搜索,这显然需要处理时间,并且我想将其外包给一个单独的进程(甚至是多个工作进程?请参阅下面的第二个问题)。此外,在某些情况下,需要调整图形,添加新边或顶点。
假设我有4 个工作进程通过异步 I/O 接受和处理传入连接。他们访问(读取/修改)图表的最佳方式是什么?单个队列显然无法实现读取访问,因为我需要以某种方式将搜索结果传回。
因此,执行此操作的一种方法是另一个队列,该队列将由图形搜索过程填充,并且我可以将其添加到事件循环中。然后事件循环可以将结果传递给处理程序。然而,这种基于事件/回调的方法将使得必须始终将相应的套接字传递给回调,从而传递给队列——这很讨厌,因为套接字是不可挑选的。(更不用说回调导致意大利面条代码的事实了。)
我刚刚想到的另一个想法可能是为每个传入连接创建一个到图形进程的管道,然后在图形方面也执行异步 I/O。但是,为了避免回调,如果我理解正确,我需要一个使用yield from
(即tulip / PEP 3156)的异步 I/O 库。还有其他选择吗?
关于图形方面的异步 I/O :这当然是一次处理许多传入请求的最佳方式,但进行图形查找是一项 CPU 密集型任务,因此可以从使用多个工作线程或进程中获益。问题是:多线程允许共享数据,但 Python 的 GIL 在某种程度上否定了性能优势。另一方面,多个进程没有这个问题,但我如何在它们之间共享和同步数据?(对我来说,拆分图表似乎是不可能的。)有什么办法可以很好地解决这个问题吗?此外,将异步 I/O 与多线程/多处理混合在性能方面是否有意义?