我之前曾问过这个问题可能对我的具体情况的解释可能不够明确。我之前的问题被投票为how to get the return value from a thread in python?
的副本也许我应该解释得更多。我已经阅读并尝试了引用的线程,但我从那里做的任何事情似乎都没有用。 (我可能只是错误地实现它。)
我完成所有工作和数据转换的主要课程是:
class SolrPull(object):
def __init__(self, **kwargs):
self.var1 = kwargs['var1'] if 'var1' in kwargs else 'this'
self.var2 = kwargs['var2'] if 'var2' in kwargs else 'that'
def solr_main(self):
#This is where the main data transformation takes place.
return(self.flattened_df)
我需要创建多个对象,让它们从Solr数据库中拉出来,并在不同的线程中同步转换数据。
我的参数必须传递给SolrPull类,而不是传递给solr_main函数。
在继续处理之前,我需要等待那些回报。
我从引用的帖子中尝试了几个不同的答案,但没有任何效果。
使用该线程的已接受答案,我做了:
class TierPerf(object):
def pull_current(self):
pool = ThreadPool(processes=5)
CustomerRecv_df_result = pool.apply_async(SolrPull(var1='this', var2='that').solr_main())
APS_df_result = pool.apply_async(SolrPull(var1='this', var2='that').solr_main())
self.CustomerRecv_df = CustomerRecv_df_result.get()
self.APS_df = APS_df_result.get()
但是拉动和转换并不是同步发生的。 然后,当我执行.get()时,我得到错误'DataFrame对象不可调用'。
作为最终结果,我需要能够同步调用SolrPull(* args).solr_main()并返回pandas数据帧,然后将其用于进一步处理。
答案 0 :(得分:1)
好吧,在经历了所有的挣扎和痛苦之后,我在发布这个问题后终于找到了我的具体细节。
我回到原来的解决方案,然后将我想要的数据框(self.CustomerRecv_df)设置为return dataframes属性(CustomerRecv_df.flattened_df)。
class TierPerf(object):
def pull_current(self):
thread_list = []
CustomerRecv_df = SolrPull(var1='this', var2='that')
tr_CustomerRecv_df = threading.Thread(name='Customerrecev_tier', target=CustomerRecv_df.solr_main)
thread_list.append(tr_CustomerRecv_df)
APS_df = SolrPull(var1='this', var2='other')
tr_APS_df = threading.Thread(name='APS_tier', target=APS_df.solr_main)
thread_list.append(tr_APS_df)
for thread in thread_list:
print('Starting', thread)
thread.start()
for thread in thread_list:
print('Joining', thread)
thread.join()
self.CustomerRecv_df = CustomerRecv_df.flattened_df
self.APS_df = APS_df.flattened_df