首页 > 解决方案 > 如何重置在 Python 的无限 while 循环中运行的异步循环或池?

问题描述

我在这里有点 Python 新手。我正在编写将从 Web URL 请求 JSON 数据的代码,继续更新请求,直到达到某个时间范围内的数据,将所有数据保存到文件中(可能是数百万行,所以我试图保留内存不足),在统计分析后将数据压缩为 CSV 文件的单行。我已经记下了那段代码,但程序会循环遍历一个包含数千个名称的列表,这些名称在变量中用于调用 URL。如果我在一个循环中运行它,它会比我的时间框架更长,并且程序继续落后。

我尝试将其作为使用 ThreadPoolExecutor 的异步循环和具有数十个工作人员的池来运行。我可以使用比可用处理器内核更多的线程,因为大部分时间都花在等待 URL 响应上,这会打开线程以发出新请求。

也就是说,我无法让任何形式的池或循环继续通过 while 循环的单次迭代。代码看起来像这样:

variables = ['thousands', 'of', 'variables']
interval = 15 # in minutes

class DoSomething() 
    def dosomething(self, variable, date, initialtime, interval):
        callweburl(variable, date, initialtime, interval)
        runstatistics
        saveCSV


def worker(variable)
    try: 
        ds = DoSomething(variable, date, initialtime, interval).dosomething()
        api.ds(variable)
    except:
        return False
pool = Pool(100)

program to get date, initialtime and currenttime
while initialtime < currenttime:
    while initialtime < initialtime * multiple of interval
        if __name__ == '__main__'
            for variable in variables:
                pool.apply_async(worker, (variable,))
        initialtime = initialtime + interval
    program to get date, new initialtime and currenttime
    time_to_pause = initialtime - currenttime + interval
    if time_to_pause > 0.0:
        time.sleep(time_to_pause)

当我apply_asyncDoSomething(variable, date, initialtime, interval).dosomething(). 当我使用池或循环运行它们时,它们充其量只是零星的。根据我放置pool.close()和的位置pool.join(),它们要么运行一个循环并关闭程序,要么将在池收集的时间间隔内遍布整个电路板。有时它会在同一时间间隔内收集两次数据,有时它会一次跳过几天。

有没有办法关闭循环或池并重新初始化它?我还尝试将池或循环初始化移动到调用 while 循环之前。似乎没有什么工作非常正确。

提前感谢您的帮助!

标签: pythonloopsmultiprocessingthreadpoolexecutorpython-asyncio

解决方案


推荐阅读