如何从线程返回数据框对象

时间:2018-03-12 14:23:04

标签: multithreading python-3.x

我之前曾问过这个问题可能对我的具体情况的解释可能不够明确。我之前的问题被投票为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数据帧,然后将其用于进一步处理。

1 个答案:

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