我需要做些什么来优化多步骤producerconsumer模型?

2024-03-29 15:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三步生产者/消费者设置。你知道吗

Client创建JSON编码的字典,并通过命名管道将它们发送给PipeServer

这是我的穿线。穿线子类:

PipeServer创建命名管道并将消息放入队列unprocessed messages

Processorunprocessed messages获取项,处理它们(通过lambda函数参数),并将它们放入队列processed messages

Printersprocessed messages获取项,获取锁,打印消息,然后释放锁。你知道吗

在测试脚本中,我有一个PipeServer、一个处理器和4台打印机:

pipe_name = '\\\\.\\pipe\\testpipe'
pipe_server = pipetools.PipeServer(pipe_name, unprocessed_messages)

json_loader = lambda x: json.loads(x.decode('utf-8'))
processor = threadedtools.Processor(unprocessed_messages,
                                    processed_messages,
                                    json_loader)

print_servers = []
for i in range(4):
    print_servers.append(threadedtools.Printer(processed_messages,
                                         output_lock,
                                         'PRINTER {0}'.format(i)))

pipe_server.start()
processor.start()
for print_server in print_servers:
    print_server.start()

问题:在这种多步骤设置中,如何通过优化打印机线程数和处理器线程数来进行思考?例如,如何知道4是打印机线程的最佳数目?我应该有更多的处理器吗?你知道吗

我通读了Python Profilers文档,但没有看到任何有助于我思考这种权衡的东西。你知道吗


Tags: json管道server打印机处理器线程start命名
1条回答
网友
1楼 · 发布于 2024-03-29 15:28:02

一般来说,您希望优化最慢组件的最大吞吐量。在本例中,它听起来像客户端或打印机。如果是客户机,您只需要足够的打印机和处理器来跟上新消息(可能只有一个!)。否则,您将在不需要的线程上浪费资源。你知道吗

如果是打印机,则需要针对正在发生的IO进行优化。需要考虑的几个变量:

  • 你能同时有几把锁?你知道吗
  • 您必须为打印事务的长度保持锁定吗?你知道吗
  • 打印操作需要多长时间?你知道吗

如果只能有一个锁,那么应该只有一个线程,以此类推。你知道吗

然后,您需要测试真实世界中的操作(很难预测RAM、磁盘和网络活动的组合会降低您的速度)。对代码进行指令插入,以便查看在任何给定时间有多少线程处于空闲状态。然后创建一个以最大吞吐量将数据处理到系统中的测试用例。从每个组件的任意数量的线程开始。如果客户端、处理器或打印机线程总是很忙,请添加更多线程。如果一些线程总是空闲的,就把一些线程拿走。你知道吗

如果将代码移到不同的硬件环境中,则可能需要重新调整-不同的处理器数量、更多的内存、不同的磁盘都会产生影响。你知道吗

相关问题 更多 >