apply_async回调函数未被调用

时间:2016-06-19 12:43:02

标签: python python-3.x concurrency pool

我是python的新手,我有为我的数据计算功能的函数,然后返回一个应该处理并写入文件的列表。,...我正在使用Pool进行计算然后使用回写函数写入文件,但回调函数没有被调用,我已经在其中放了一些print语句,但它绝对没有被调用。 我的代码看起来像这样:

def write_arrow_format(results):
print("writer called")
results[1].to_csv("../data/model_data/feature-"+results[2],sep='\t',encoding='utf-8')
with open('../data/model_data/arow-'+results[2],'w') as f:
     for dic in results[0]:
         feature_list=[]
         print(dic)
         beginLine=True
         for key,value in dic.items():
              if(beginLine):
                feature_list.append(str(value))
                beginLine=False
              else:
                feature_list.append(str(key)+":"+str(value))
         feature_line=" ".join(feature_list)
         f.write(feature_line+"\n")


def generate_features(users,impressions,interactions,items,filename):
    #some processing 
    return [result1,result2,filename]





if __name__=="__main__":
   pool=mp.Pool(mp.cpu_count()-1)

   for i in range(interval):
       if i==interval:
          pool.apply_async(generate_features,(users[begin:],impressions,interactions,items,str(i)),callback=write_arrow_format)
       else:
           pool.apply_async(generate_features,(users[begin:begin+interval],impressions,interactions,items,str(i)),callback=write_arrow_format)
           begin=begin+interval
   pool.close()
   pool.join()

1 个答案:

答案 0 :(得分:4)

从您的帖子中 library(dplyr) f <- as.data.frame(list.files(), header=FALSE) colnames(f) <- 'origFilename' f2 <- f %>% separate(origFilename, into=c('ID','date','channel','position','extension'), sep='_', remove=FALSE) %>% filter(ID > 10) f2$ID <- as.numeric(f2$ID) f3 <- f2 %>% mutate(newID = ID + 1) f3$newFilename <- paste(f3$newID, f3$date, f3$channel, f3$position, f3$extension, sep='_') f3$origFilename <- paste(f3$ID, f3$date, f3$channel, f3$position, f3$extension, sep='_') file.rename(f3$origFilename, f3$newFilename) 返回的列表中包含的内容并不明显。但是,如果generate_featuresresult1result2中的任何一个不可序列化,则由于某种原因,多处理lib将不会调用回调函数,并且将无法以静默方式执行此操作。我认为这是因为多处理lib尝试在子进程和父进程之间来回传递对象之前对其进行pickle。如果您回来的任何事情都不是可选择的&#34; (即不可序列化)然后回调不被调用。

我自己也遇到过这个错误,结果发现它是一个记录器对象的实例,它给我带来了麻烦。以下是一些重现我的问题的示例代码:

filename

希望这对您有所帮助并指出正确的方向。