如何在Python的无限while循环内重置运行的asyncio循环或池?

时间:2019-11-15 04:44:10

标签: python loops multiprocessing threadpoolexecutor python-asyncio

我在这里有点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_async代替DoSomething(variable, date, initialtime, interval).dosomething()调用时,循环运行良好。当我使用池或循环来运行它们时,它们充其量只是零星的。根据我放置pool.close()pool.join()的位置,它们要么运行一个循环并关闭程序,要么在池收集的时间间隔内遍及整个程序。有时,它会两次在相同的时间间隔内收集数据,而有时它会一次跳过几天。

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

在此先感谢您的帮助!

0 个答案:

没有答案