最近在写毕业论文的系统,总是在主程序中创建新线程之后导致整个程序系统卡顿不运作,起初以为是主动阻塞了的原因(实际我没有主动阻塞它)
可能的解决方法:
(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()
将函数立即执行,而不是将函数本身作为参数传递给线程对象。因此,新线程并没有真正执行我们想要的函数,导致程序似乎“卡住”。