python - 在进行网络编程时,是否有经验法则来确定使用多少个线程?

标签 python multithreading threadpool

假设我有一个包含 1000 个唯一网址的列表,我需要打开每个网址,并断言页面上有某些内容。按顺序执行此操作显然是一个糟糕的选择,因为大多数时候程序都会闲置只是等待响应。因此,添加到一个线程池中,每个工作线程从主队列中读取数据,并打开一个 url 进行检查。我的问题是,我要建多大的游泳池?它基于我的网络带宽还是其他一些指标?是否有任何经验法则,或者只是通过反复试验来找到有效的尺寸?

这更多的是一个理论问题,但这是我正在使用的代码的基本轮廓。

if __name__ == '__main__':
    #get the stuff I've already checked
    ID = 0
    already_checked = [i[ID] for i in load_csv('already_checked.csv')]

    #make sure I don't duplicate the effort
    to_check = load_csv('urls_to_check.csv')
    links = [url[:3] for url in to_check if i[ID] not in already_checked]

    in_queue = Queue.Queue()
    out_queue = Queue.Queue()

    threads = []
    for i in range(5):
        t = SubProcessor(in_queue, out_queue)
        t.setDaemon(True)
        t.start()
        threads.append(t)

    writer = Writer(out_queue)
    writer.setDaemon(True)
    writer.start()

    for link in links:
        in_queue.put(link)

最佳答案

您最好的选择可能是编写一些代码,使用您指定的线程数运行一些测试,并查看有多少线程产生最佳结果。有太多变量(处理器速度、总线速度、线程开销、核心数量以及代码本身的性质),我们无法冒险猜测。

关于python - 在进行网络编程时,是否有经验法则来确定使用多少个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16284014/

相关文章:

python - 使用Django服务 protected 媒体文件

python - 美丽汤 : how to find all elements 2nd parent of which has exact attribute?

c# - WPF : How to not block the GUI thread in HwndHost. BuildWindowCore 中的死锁?

multithreading - OmniThreadLibrary:如何检测所有递归调度(=池化)线程何时完成?

python - py2exe - 最大递归深度错误

c++ - 自定义条件作用域互斥锁

linux - 如何将某些内核线程绑定(bind)到给定的内核?

c++ - C++ 类的构造函数中的线程池被杀死

java - Spring任务执行器安排了太多的任务实例

python - Python 中可以存在 "soft references"吗?