我正在阅读数百条推文,我会检查网址。我正在使用多线程来完成此任务,因为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
答案 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)。