多处理卡在地图功能上

时间:2019-04-26 21:49:24

标签: python python-3.x multithreading multiprocessing python-multiprocessing

我目前正在使用分页方法发出一个具有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()

1 个答案:

答案 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)

如果您的主进程正在运行并且正确地写入文件,那么应该可以使您的进程正确关闭。