首页 > 解决方案 > 将动态生成的列表传递给多进程

问题描述

我正在尝试将动态生成的日期变量列表传递到多进程池中。

data_2_days()当我从多进程中询问特定日期时工作正常,但如果我使用生成字符串,data_start_and_end()我会得到:

ValueError:需要超过 1 个值才能解压

我相信返回的字符串用引号引起来,这就是导致问题的原因。

生成要传递到多进程池的日期变量列表的最佳方法是什么?

谢谢

def data_start_and_end(start_date,end_date):

    start_date = DateTime.strptime(start_date, '%Y-%m-%d')
    end_date = DateTime.strptime(end_date, '%Y-%m-%d')

    no_days = (end_date-start_date).days

    date_str = "("
#    date_end_str = 
    x = 0
    while x <= no_days :
        if x ==0:
            date = start_date

        if date.month < 10:
            month_str = "0"+str(date.month)
        else:
            month_str = date.month

        if date.day < 10:
            day_str = "0"+str(date.day)
        else:
            day_str = date.day            

        date_str = date_str + "['"+ str(date.year) + "','" + str(month_str) + "','" + str(day_str) +"'],"


#        print date_str
        date = date + TimeDelta(days=1)
        x=x+1

    date_str = date_str[:-1] + ")"
    print date_str         
#        dates = 
    return(date_str)

def data_2_days():

    data = ( \
['2018','01','01'], \
['2018','01','02'])

    return(data)

def figure_probs_mp(start_date,end_date):

    data = ZZ_MP_data_lists.data_start_and_end(start_date,end_date)
    pool = multiprocessing.Pool(36)  
    pool.map(figure_probs, data)
    pool.close()
    pool.join() 


figure_probs_mp(start_date,end_date) 

标签: pythonmultiprocess

解决方案


这里的问题是您不是生成列表而是生成字符串。

data_2_days中,您返回一个包含 3 个元素的 2 个元组的列表。在figure_probs中,当您遍历此列表时,您会在每次迭代时获得元组,您可以将其拆分为 3 个元素。

data_start_and_end中,您生成一个字符串,表示 3 个元素的元组列表。然后,在 中figure_probs,当您遍历此字符串时,每次迭代都会得到 1 个字符,python 解释器返回 ,ValueError因为您尝试将这个单个字符拆分为 3。更改您的data_start_and_end函数以生成元组列表,它应该可以正常工作。

def data_start_and_end(start_date,end_date):

    start_date = DateTime.strptime(start_date, '%Y-%m-%d')
    end_date = DateTime.strptime(end_date, '%Y-%m-%d')

    no_days = (end_date-start_date).days

    list_dates = []
    x = 0
    current_date = start_date
    while x <= no_days:

        if date.month < 10:
            month_str = "0"+str(current_date.month)
        else:
            month_str = str(current_date.month)

        if date.day < 10:
            day_str = "0"+str(current_date.day)
        else:
            day_str = str(current_date.day)          

        list_dates.append((str(current_date.year), month_str, day_str))
        current_date = current_date + TimeDelta(days=1)
        x = x + 1

    return list_dates

附带说明,return是 python 中的语句,不需要括号。我认为您也可以读取变量x并迭代 while date <= end_date


推荐阅读