运行并发线程(Python)有最大限制吗?

时间:2017-08-21 11:41:52

标签: python python-multithreading

我正在阅读数百条推文,我会检查网址。我正在使用多线程来完成此任务,因为URL读取需要超过一秒钟。但是,我不确定在这种情况下我可以同时并行运行多少个线程?

import Queue
import threading
q = Queue.Queue()
thread limit = 100

for tweet in tweets[0:threadlimit]:
            t = threading.Thread(target=process_tweet, args=(q, tweet))
            t.daemon = True
            t.start()


    for tweet in tweets[0:threadlimit]:
          tweet = q.get()

我之所以这样问,当我使用线程限制为100时,它工作正常但是对于200的线程限制,它会卡住。

平台:Linux

1 个答案:

答案 0 :(得分:3)

操作系统总是对线程数有一些限制,每个线程使用一些资源(特别是一些空间,也许是一兆字节,用于线程call stack)。因此拥有大量线程是不合理的。细节是操作系统和计算机特定的。在Linux上,请参阅getrlimit(2)以获取RLIMIT_STACK(默认堆栈大小)和RLIMIT_NPROC(进程数,实际上是任务,包括允许您拥有的线程)..以及{{ 3}}& pthread_attr_setstacksize(3)

线程通常对资源很重(所以请阅读pthread_create(3))。你不希望在笔记本电脑或台式机上有很多(例如数千甚至一百)个(一些超级计算机或昂贵的服务器有数百个核心green threads,那么你可以尝试拥有更多的线程)。

另请阅读NUMA

Python的常见实现使用 C10K problem,因此拥有大量线程无效。我建议使用合理大小的Global Interpreter Lock(可能是可配置的,最多可能是几十个)。

考虑使用thread pool及其PycURL接口(请参阅libcurl中MULTI的文档)。考虑relevant C API(也许event loop)。