【发布时间】:2019-09-12 17:59:27
【问题描述】:
我是多线程 Web 服务器编程的新手 现在我正在编写一个服务器程序:
- 从tcp socket接收消息(自定义数据格式)
- 处理这些消息(这需要时间)
- 向套接字发送相应的响应
- 为接收消息和发送响应提供 ACK 机制,即每条消息都包含一个唯一的 seq 号,我应该在相应的响应中包含 ack(与 seq 相同)。对方也实现了这个机制。如果我在 5 分钟内没有收到对方的 ACK,我应该重新发送我希望收到相应 ACK 的消息。
我的想法是使用 while 循环从套接字接收消息,然后处理消息并发送响应。
问题是,处理消息需要时间,而且我可能会在短时间内收到多条消息。因此,如果我在这个 while 循环中调用 process_message() 函数并等待其完成,它将阻塞,我肯定会浪费时间。所以我需要非阻塞方式。
我做了一些研究。我想我可能会使用两种常见的技术:线程池和消息队列。
对于线程池,我的想法类似于下面的伪代码:
def process_message():
process_message // takes time
send_response(socket)
while True:
message = recv(socket)
thread = thread_pool.get_one()
thread.start(target=process_message)
对于消息队列,我不确定,但我的想法是有生产者线程和消费者线程:
def consumer:
// only one consumer thread?
message = queue.poll()
consumer_thread.process_message(message)
send_response(socket)
while True:
// only one producer thread?
message = recv(socket)
producer_thread.put_message_to_queue()
希望我的想法很清楚。谁能提供一些典型的解决方案?
那么,诡计多端的部分,关于如何实现 ACK 机制有什么想法吗?
谢谢!
【问题讨论】:
-
TCP是可靠的,为什么需要自己的ack机制?您可以使用选择超时。
标签: python multithreading tcp message-queue