我在这里有点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循环之前。似乎没有什么工作很正确。
在此先感谢您的帮助!