我得到以下错误:
----- Match 93028: ------ Patch 5.11 ------78 Threads Active
----- Match 93029: ------ Patch 5.11 ------77 Threads Active
----- Match 93030: ------ Patch 5.11 ------76 Threads Active
----- Match 93031: ------ Patch 5.11 ------71 Threads Active
----- Match 93032: ------ Patch 5.11 ------55 Threads Active
----- Match 93033: ------ Patch 5.11 ------56 Threads Active
----- Match 93034: ------ Patch 5.11 ------57 Threads Active
----- Match 93035: ------ Patch 5.11 ------58 Threads Active
----- Match 93036: ------ Patch 5.11 ------59 Threads Active
Traceback (most recent call last):
File "pulldata.py", line 91, in <module>
getPatchData('5.11', '511')
File "pulldata.py", line 64, in getPatchData
matchThread.start()
File "/usr/lib/python3.4/threading.py", line 850, in start
_start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread通常,这是由于打开的线程太多造成的,但正如您所看到的,我还打印了活动线程的数量。有少于100个活动线程,所以我不确定问题出在哪里。相关代码如下:
slot = threading.BoundedSemaphore(value=1000)
def getMatchData(index,match,patch):
global requestsSent
global logfile
print("----- Match {0}: ------ Patch {1} ------{2} Threads Active".format(index,patch,threading.active_count()))
logfile.write("Parsing Match {0} for patch {1}:\n".format(index,patch))
#match is a class. get is a function that sends a request to the server and returns a request object from where I get the json response.
data = match.get().json()
#processdata
slot.release()
def getPatchData(patch, name):
global logfile
threads = []
matches = getAllMatches(patch)
for index, match in enumerate(matches):
slot.acquire()
matchThread = threading.Thread(target=getMatchData, args=(index,match,patch))
threads.append(matchThread)
matchThread.start()
for t in threads:
if not t.isAlive():
threads.remove(t)
for t in threads:
t.join()插槽信号量应该限制活动线程的数量,但我认为我从来没有达到过1000个线程。在我假设这个错误是由我的线程数组指向的线程引起的,所以我添加了代码,以便在它们不再活动时将它们从数组中删除。
我不明白为什么在只有59个活动线程的情况下,我无法启动一个新线程。
另外,有没有更好的方法来实现我想要做的事情?每个线程向API发送一个请求。我试着在没有并发的情况下做这件事,但我甚至没有接近我的速率限制。
发布于 2015-10-20 16:09:56
我遇到了类似的问题,下面是我是如何解决它的。
不确定OP使用的是什么操作系统,但是在Linux上,每个用户的进程数通常是有限制的。您可以使用ulimit -u (或ulimit -a)查看它。这个定义有点用词不当,因为限制实际上是操作系统线程的数量(或LWP)。(请访问:https://superuser.com/questions/376532/does-gnu-linux-counts-processes-and-threads-together-when-i-limit-their-number查看接受的答案)
在我的系统上,这个限制似乎设置为400 (但它可以由管理员更改)。
您可以使用以下命令查看所有线程的列表:
ps -fLu <your_username>
在我的例子中,我的python应用程序将引发与OP报告的相同的异常,但threading.active_count()将返回7。
事实证明,我有很多以前会话遗留下来的进程(我有点太热衷于nohup了…),每个进程都有几个线程,挂在系统中。删除它们可以消除线程创建错误。
发布于 2020-11-27 09:10:30
我在类似的情况下运行,但我的进程需要大量线程运行。
我用下面的命令计算了线程数:
ps -fLu user | wc -l
它显示4098。
我切换到用户并查看系统限制:
sudo -u myuser -s /bin/bash
ulimit -u
得到了4096作为响应。
因此,我编辑了/etc/security/limits.d/30-myuser.conf并添加了以下行:
myuser hard nproc 8192
myuser soft nproc 8192
重新启动了服务,现在它以7017个线程运行。
Ps。我有一个32核的服务器,我用这个配置来处理18k的并发连接。
https://stackoverflow.com/questions/32283003
复制相似问题