0

我的程序是 ICAPServer(与 httpserver 类似),它的主要工作是从客户端接收数据并将数据保存到 DB。

有两个主要步骤和两个线程:

  1. ICAPServer 从客户端接收数据,将数据放入队列(50kb <1ms);
  2. 另一个线程从队列中弹出数据,并将它们写入 DB SO,如果第二步太慢,队列将用这些数据填满内存。

想问问大家有没有什么建议...

4

3 回答 3

2

很难确定,但也许在这种情况下使用两个进程而不是线程会有所帮助。由于 Python 具有全局解释器锁 (GIL),因此它的作用是在任何时候都只允许任何一个线程执行 Python 指令。

围绕流程设计的系统可能具有以下优点:

  • 更高的并发性,尤其是在多处理器机器上
  • 更大的吞吐量,因为您可能会产生多个队列消费者/数据库写入器进程来分散工作。虽然,如果瓶颈真的是数据库而不是写入数据库的进程,那么这种影响可能很小。
于 2009-07-12T15:22:35.670 回答
0

对队列中的数据量设置上限?

于 2009-07-12T14:59:42.690 回答
0

注意事项:在进行优化之前,进行一些良好的测量和分析非常重要。

也就是说,我敢打赌第二步中缓慢的部分是数据库通信;您可以尝试分析 SQL 语句及其执行计划。然后对其进行优化(这是 SQLAlchemy 的特性之一);如果仍然太慢,请检查数据库优化。

当然,瓶颈可能在完全不同的地方。在这种情况下,您仍然有机会使用 C 代码、专用网络或更多线程进行优化——仅举三个可能的完全不同类型的优化示例。

另一点:由于 I/O 操作通常会释放 GIL,您也可以尝试通过添加另一个读取器线程来提高性能 - 我认为这可能是一个更便宜的解决方案。

于 2009-07-12T18:16:55.210 回答