python - Python多线程线程在继续之前不等待.join()
问题描述
我一直在尝试使用该threading
库进行多线程处理,并为几个不同的函数创建不同的线程。这些函数将 pandas 数据框作为参数,并对 AWS Redshift 运行 SQL 查询,并将检索到的数据作为列添加到数据框。但是,我有一个问题,在线程完成后打印数据帧时,有时其中一列会是空的。这似乎是随机的,有时添加所有列都没有任何问题。我认为 的目的.join()
是通过等待每个线程完成后再继续来防止这种情况发生,但情况似乎并非如此。
import pandas as pd
import threading
df = pd.DataFrame()
def redshift_query1(df):
run query
df[column_name1] = query_results
def redshift_query2(df):
run query
df[column_name2] = query_results
def redshift_query3(df):
run query
df[column_name3] = query_results
t1 = threading.Thread(target=redshift_query1, args = [df])
t2 = threading.Thread(target=redshift_query2, args = [df])
t3 = threading.Thread(target=redshift_query3, args = [df])
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print(df)
解决方案
pandas 不是线程安全的。有关详细信息,请参阅。但是,内置类型在 Python 中是线程安全的。因此,您可以将结果保存在 dict 中,然后创建一个 DataFrame。
import pandas as pd
import threading
result = {}
def redshift_query1(df):
result["column_name1"] = [3]
def redshift_query2(df):
result["column_name2"] = [2]
def redshift_query3(df):
result["column_name3"] = [1]
t1 = threading.Thread(target=redshift_query1, args = [df])
t2 = threading.Thread(target=redshift_query2, args = [df])
t3 = threading.Thread(target=redshift_query3, args = [df])
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
df = pd.DataFrame(result)
推荐阅读
- spring - Spring Security users aren't getting roles
- azure - Azure DevOps:无法从 Azure Pipeline 中的源加载 nuget 包
- javascript - React 路由器无法识别带有 history.push() 的新 :flag
- java - Load Full Image Recyclerview Cardview
- excel - 如何使用带有日期的多个条件从另一个工作表中查找单元格
- java - Spring Boot 将属性加载为 java.util.Properties
- javascript - 使用刷新间隔在 GoogleMaps 中刷新 KML
- spring - how to get prometheus webflux r2dbc in spring work together? It gives me error when I try to run actual apis from service
- javascript - How to take image(s) when user happy and face detected using face-api
- java - 如何在连接表上构建 JPQL 查询?