我目前正在使用分页方法发出一个具有3,000,000条记录的http请求。有时由于104服务器错误而导致呼叫失败,因此我重试,该呼叫第二次或第三次工作。
因为请求太多,所以我在python中使用了multiprocess函数来加快速度。我正在使用ubuntu 16机器,python3.5和8核机器。奇怪的是,所有文件都被写入,并且进程“完成”,即到达范围的末尾(无论大小如何,即100万,200万或300万),但都无法通过缓冲池线。因此,我的tmux会话只说“正在处理日期(lastrecordnumber)”,所以我需要发送该电子邮件,以便让我知道任务已完成。
我已经尝试过pool.map()
; pool.aysnc()
; pool.map_async()
,它们似乎都存在相同的问题。
import http.client
from multiprocessing import Pool
from functools import partial
def get_raw_data(auth, url_conn, skip):
headers = {'authorization': "Basic {}".format(auth)}
sucess = None
loop = 0
while not sucess:
try:
conn = http.client.HTTPSConnection(url_conn)
conn.request("GET", "SOME_API&$skip={}".format(skip), headers=headers)
res = conn.getresponse()
data = res.read()
raw_data = json.loads(data.decode("utf-8"))
sucess = 'yes'
except Exception as e:
print('stuck in loop {} {} {}'.format(skip, loop, e))
loop += 1
with open('{}.json'.format(skip), 'w') as outfile:
json.dump(raw_data, outfile)
def process_skips(skip):
print('Working on date {}'.format(skip))
get_raw_data(skip)
if __name__ == '__main__':
print("We started at {}".format(dt.datetime.now()))
n = range(0,3597351,5000)
n = list(n)
pool = Pool(8)
pool.map_async(process_skips, n)
pool.close()
pool.join()
答案 0 :(得分:0)
使用with
将pool用作上下文管理器,它负责关闭/加入进程,并且似乎是文档中的首选方法。
if __name__ == '__main__':
print("We started at {}".format(dt.datetime.now()))
n = list(range(0,3597351,5000))
with Pool(8) as pool:
pool.map_async(process_skips, n)
如果您的主进程正在运行并且正确地写入文件,那么应该可以使您的进程正确关闭。