无法启动新线程。<100个活动线程

2024-04-25 05:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到以下错误:

----- 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()

slots信号量应该限制活动线程的数量,但我认为我从来没有达到过1000个线程。在我假设这个错误是由于我的线程数组指向线程导致的之前,我添加了代码,以便在线程不再处于活动状态时将它们从数组中删除。

我不明白为什么只有59个活动线程时,get无法启动新线程。

还有,有没有更好的方法来实现我的目标?每个线程都向API发送一个请求。我试着不同时做,但我甚至没有接近我的利率限制。


Tags: inforgetindexmatch线程startpatch
1条回答
网友
1楼 · 发布于 2024-04-25 05:58:00

我遇到了一个类似的问题,下面是我如何解决的。

不确定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有点太热衷了),每个进程都有几个线程,在系统中徘徊。删除它们可以消除线程创建错误。

相关问题 更多 >