【20240228】Python主程序创建新线程以后卡住可能原因

        最近在写毕业论文的系统,总是在主程序中创建新线程之后导致整个程序系统卡顿不运作,起初以为是主动阻塞了的原因(实际我没有主动阻塞它)

可能的解决方法:

(1)不要主动阻塞原程序(可能是废话,但是提醒一下和我一样基础不是很扎实的同学)

import threading
import time

# 定义一个函数作为新线程的执行体
def thread_function():
    print("Thread started")
    time.sleep(3)  # 模拟线程执行一些任务,这里暂停 3 秒钟
    print("Thread finished")

# 创建一个新线程
new_thread = threading.Thread(target=thread_function)

# 启动新线程
new_thread.start()

# 等待新线程结束(可选)!!!!!!!!!!!!!
new_thread.join()

# 主线程继续执行
print("Main thread finished")

比如上方代码,new_thread.join()就应当舍去,让多个线程都能“同时”运行下去

(2)观察自己的代码,在new_thread = threading.Thread(target=thread_function)中是否在targer函数thread_function后面加了()——括号?????

我个人是因为这个原因导致整个程序既不报错,也无响应,起初我猜想是否多个线程争抢资源(临界区资源),导致出现什么死循环,但是经过检查不是这个原因。

关于(2)的原理解释如下:

在 Python 中,当你创建新线程时,使用 target 参数指定的函数是作为一个可调用对象传递给线程对象的。如果你在 target 参数后面加上了 (),相当于立即调用了该函数,而不是将函数本身作为参数传递给线程对象。这样会导致线程在创建时就执行了这个函数,而不是在新线程中执行。

让我们通过一个示例来说明:

import threading

# 定义一个线程函数
def my_thread_function():
    print("Hello from new thread!")

# 创建线程时,target后面不加()
thread = threading.Thread(target=my_thread_function)

# 启动线程
thread.start()

在这个示例中,我们定义了一个线程函数 my_thread_function()。在创建线程时,我们将这个函数作为可调用对象传递给了 target 参数,而没有在函数名后面加上 ()。这样做是正确的方式,因为我们希望在新线程中执行这个函数。

如果我们错误地在 target 参数后面加上了 (),就会导致线程在创建时立即执行该函数:

import threading

# 定义一个线程函数
def my_thread_function():
    print("Hello from new thread!")

# 创建线程时,target后面加()
thread = threading.Thread(target=my_thread_function())

# 启动线程
thread.start()

在这个示例中,target=my_thread_function() 将函数立即执行,而不是将函数本身作为参数传递给线程对象。因此,新线程并没有真正执行我们想要的函数,导致程序似乎“卡住”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值