Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 高效内存的海量http请求_Python 3.x_Multithreading - Fatal编程技术网

Python 3.x 高效内存的海量http请求

Python 3.x 高效内存的海量http请求,python-3.x,multithreading,Python 3.x,Multithreading,我需要一个接一个地执行来自web API的无限HTTP请求,并使其高效、快速地工作。(我需要一个实用工具,所以无论我使用它多少次,它都应该可以工作,而且它应该能够在web服务器上使用(人们同时使用)) 现在,我正在对队列使用线程,但在执行一段时间后,我会遇到如下错误: “无法启动新线程” “记忆错误” 或者它可能会工作一点,但相当慢 这是我代码的一部分: concurrent = 25 q = Queue(concurrent * 2) for i in range(concurrent):

我需要一个接一个地执行来自web API的无限HTTP请求,并使其高效、快速地工作。(我需要一个实用工具,所以无论我使用它多少次,它都应该可以工作,而且它应该能够在web服务器上使用(人们同时使用)) 现在,我正在对队列使用线程,但在执行一段时间后,我会遇到如下错误:

无法启动新线程”

记忆错误”

或者它可能会工作一点,但相当慢

这是我代码的一部分:

concurrent = 25
q = Queue(concurrent * 2)
for i in range(concurrent):
    t = Thread(target=receiveJson)
    t.daemon = True
    t.start()
for url in get_urls():
    q.put(url.strip())
q.join()
*get_url()是一个简单的函数,返回URL列表(未知长度)

这是我的ReceiveJSON(线程目标):


问题来自
线程
s永无止境,请注意,
receiveJson
函数中没有退出条件。发出结束信号的最简单方法通常是排队
None

def receiveJson():
尽管如此:
url=q.get()
如果url为None:#退出条件允许线程完成
q、 任务完成()
打破
res=request.get(url.json())
q、 任务完成()
然后您可以按如下方式更改其他代码:

concurrent=25
q=队列(并发*2)
对于范围内的i(并发):
t=线程(目标=receiveJson)
t、 daemon=True
t、 开始()
对于get_url()中的url:
q、 put(url.strip())
对于范围内的i(并发):
q、 put(None)#为每个线程添加一个None,以便能够获取和完成
q、 加入

还有其他方法可以做到这一点,但这就是如何在代码更改最少的情况下做到这一点。如果这种情况经常发生,可能值得研究该类以避免经常打开线程的成本。

“过一段时间”多久是一段时间?第一个代码块调用了很多次吗?您不是在等待线程完成,它们也没有办法完成。因此,您可能会无限期地旋转线程。每次用户按下按钮时调用的第一个代码块,在一段时间后意味着如果用户在第6次按下该按钮大约5次,则会产生错误。
def receiveJson():
    while True:
        url = q.get()

        res = request.get(url).json()

        q.task_done()