我是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()
答案 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_features
,result1
或result2
中的任何一个不可序列化,则由于某种原因,多处理lib将不会调用回调函数,并且将无法以静默方式执行此操作。我认为这是因为多处理lib尝试在子进程和父进程之间来回传递对象之前对其进行pickle。如果您回来的任何事情都不是可选择的&#34; (即不可序列化)然后回调不被调用。
我自己也遇到过这个错误,结果发现它是一个记录器对象的实例,它给我带来了麻烦。以下是一些重现我的问题的示例代码:
filename
希望这对您有所帮助并指出正确的方向。