【发布时间】:2010-10-31 07:58:12
【问题描述】:
我需要同时发送和recv。
哪个选项更好:
- 1 个线程使用非阻塞套接字处理发送和接收
或
- 2个线程,1个处理阻塞recv() + 1个处理send()?
或者有其他解决方案吗?
我预计最多有 50 个双向连接。这导致选项 #1 中有 50 个线程,选项 #2 中有 100 个线程。
【问题讨论】:
标签: sockets networking client-server blocking
我需要同时发送和recv。
哪个选项更好:
或
或者有其他解决方案吗?
我预计最多有 50 个双向连接。这导致选项 #1 中有 50 个线程,选项 #2 中有 100 个线程。
【问题讨论】:
标签: sockets networking client-server blocking
你可以使用一个线程和两个非阻塞套接字,并使用 select() 来等待传入的输入和输出队列中的空间。
那么你不需要轮询,因为 select() 阻塞而不使用处理器时间。
【讨论】:
您应该使用非阻塞套接字,而不是手动轮询它们,您应该让内核为您完成。为此使用poll 或select(前者是首选,因为它可以一次处理更多套接字)。当你这样做时,你最终会在选项 1 中得到 1 个线程,或者在选项 2 中得到 2 个线程。:-P
【讨论】:
我不会使用这两种方法。
看看this SO 问题。我会使用一个工作线程模型,在该模型中,您将有 N 个线程使用非阻塞套接字处理所有流量。
如果您绝对必须遵循您刚才描述的方法之一,请使用非阻塞恕我直言。
【讨论】:
如果您担心性能和可扩展性,请尝试 IOCP(异步套接字读/写):How to write a scalable Tcp/Ip based server
请注意,实现 IOCP 比“每个连接一个线程”要复杂得多,而且由于您将只有 50 个连接(或您建议的 100 个线程),这可能“足够好”并且更简单正确实施。
尝试简单的方法并对其进行测量...但如果您:需要更高的性能,或者要扩展(远?)超过 50 个连接,请认真考虑 IOCP 作为更好的解决方案。
【讨论】: