我有一个三步生产者/消费者设置。你知道吗
Client
创建JSON编码的字典,并通过命名管道将它们发送给PipeServer
这是我的穿线。穿线子类:
PipeServer
创建命名管道并将消息放入队列unprocessed messages
Processor
从unprocessed messages
获取项,处理它们(通过lambda函数参数),并将它们放入队列processed messages
Printers
从processed 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文档,但没有看到任何有助于我思考这种权衡的东西。你知道吗
一般来说,您希望优化最慢组件的最大吞吐量。在本例中,它听起来像客户端或打印机。如果是客户机,您只需要足够的打印机和处理器来跟上新消息(可能只有一个!)。否则,您将在不需要的线程上浪费资源。你知道吗
如果是打印机,则需要针对正在发生的IO进行优化。需要考虑的几个变量:
如果只能有一个锁,那么应该只有一个线程,以此类推。你知道吗
然后,您需要测试真实世界中的操作(很难预测RAM、磁盘和网络活动的组合会降低您的速度)。对代码进行指令插入,以便查看在任何给定时间有多少线程处于空闲状态。然后创建一个以最大吞吐量将数据处理到系统中的测试用例。从每个组件的任意数量的线程开始。如果客户端、处理器或打印机线程总是很忙,请添加更多线程。如果一些线程总是空闲的,就把一些线程拿走。你知道吗
如果将代码移到不同的硬件环境中,则可能需要重新调整-不同的处理器数量、更多的内存、不同的磁盘都会产生影响。你知道吗
相关问题 更多 >
编程相关推荐