另一个困惑的并行编码器在这里!
我们的内部Hive数据库有一个API层,我们需要使用它来访问数据。有300秒的查询超时限制,所以我想使用多处理来并行执行多个查询:
from multiprocessing import Pool
import pandas as pd
import time
from hive2pandas_anxpy import Hive2Pandas # custom module for querying our Hive db and converting the results to a Pandas dataframe
import datetime
def run_query(hour):
start_time = time.time()
start_datetime = datetime.datetime.now()
query = """SELECT id, revenue from table where date='2014-05-20 %s' limit 50""" % hour
h2p = Hive2Pandas(query, 'username')
h2p.run()
elapsed_time = int(time.time() - start_time)
end_datetime = datetime.datetime.now()
return {'query':query, 'start_time':start_datetime, 'end_time':end_datetime, 'elapsed_time':elapsed_time, 'data':h2p.data_df}
if __name__ == '__main__':
start_time = time.time()
pool = Pool(4)
hours = ['17','18','19']
results = pool.map_async(run_query, hours)
pool.close()
pool.join()
print int(time.time() - start_time)
我遇到的问题是其中一个查询总是不返回任何数据,但是当我以通常的方式运行相同的查询时,它会返回数据。由于我是多处理新手,我想知道我上面如何使用它有任何明显的问题吗?
答案 0 :(得分:1)
我认为您遇到的问题是,在您想要使用它时,结果对象尚未就绪。此外,如果您有超时的已知时间,我建议您在代码中使用它。
此代码显示了如何在300秒后强制超时的示例,如果此时未收集所有结果的结果。
if __name__ == '__main__':
start_time = time.time()
hours = ['17','18','19']
with Pool(processes=4) as pool:
results = pool.map_async(run_query, hours)
print(results.get(timeout=300))
print int(time.time() - start_time)
否则您仍应使用results.get()
返回数据,或为map_async
指定回调函数。