Python多线程线程在继续之前不等待.join()

Posted

技术标签:

【中文标题】Python多线程线程在继续之前不等待.join()【英文标题】:Python multithreading threads not waiting for .join() before continuing 【发布时间】:2021-03-11 16:17:38 【问题描述】:

我一直在尝试使用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)

【问题讨论】:

你确定你的请求总是返回一些东西吗? 【参考方案1】:

pandas 不是线程安全的。欲了解更多信息,see。但是,内置类型在 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)

【讨论】:

以上是关于Python多线程线程在继续之前不等待.join()的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程中join方法的理解

多线程--Thread.join方法

多线程中join方法的含义

Java多线程-join的使用

java 并发多线程 : 主线程等待子线程结束的三种方式:join / CountDownLatch / CyclicBarrier

多线程线程通信调度等待集 wait() notify()