正在探索Linux上C语言中的Web爬虫的几个概念。为了决定我是否会使用阻塞IO,多路复用OI,AIO,某种组合等,我需要知道(我可能应该通过一些测试代码实际发现它,但为了方便起见,我更愿意从别人那里了解)当在阻塞模式下调用IO时,是特定线程(假设是多线程app / svc)还是整个进程本身被阻塞?更具体地说,在多头(POSIX)app / service中,专用于远程读/写的线程是否可以阻止整个过程?如果是这样,如何在不终止整个过程的情况下取消阻止此类线程?
注意:我是否应该使用阻止/非阻塞在这里不是问题。
请
答案 0 :(得分:1)
阻止调用仅阻止创建它们的线程,而不是整个进程。
是否要使用阻塞I / O(每个线程有一个套接字)或非阻塞I / O(每个线程管理多个套接字)是您需要进行基准测试的。但作为经验法则......
Linux合理有效地处理多个线程。因此,如果您只处理几十个套接字,则每个套接字使用一个线程很容易编码并且应该运行良好。如果您正在处理数百个套接字,那么这是一个更紧密的呼叫。对于数以千计的套接字,使用一个线程(或进程)管理大型组时几乎肯定会更好。
在后一种情况下,为了获得最佳性能,您可能希望使用epoll
,即使它是特定于Linux的。