我只是开始一个新线程:
self.thread = ThreadedFunc()
self.thread.start()
发生某些事情后,我想退出我的程序,所以我打电话给os._exit()
:
os._exit(1)
该程序仍然有效。一切都正常,看起来os._exit()
没有执行。
有没有不同的方法可以从不同的线程退出整个程序?如何解决这个问题?
编辑:添加了更完整的代码示例。
self.thread = DownloadThread()
self.thread.data_downloaded.connect(self.on_data_ready)
self.thread.data_progress.connect(self.on_progress_ready)
self.progress_initialized = False
self.thread.start()
class DownloadThread(QtCore.QThread):
# downloading stuff etc.
sleep(1)
subprocess.call(os.getcwd() + "\another_process.exe")
sleep(2)
os._exit(1)
编辑2:解决!有一个quit()
、terminate()
或exit()
函数,它只是停止线程。就是这么简单。看看文档就知道了。
打电话os._exit(1)
对我有用。 您应该使用标准库threading
。
我猜你使用的是multiprocessing
,这是一个基于进程的"线程"接口,它使用与threading
类似的 API,但创建子进程而不是子线程。 所以os._exit(1)
只退出子进程,不影响主进程
此外,还应确保已在主线程中调用join()
函数。否则,操作系统可能会计划在开始在子线程中执行任何操作之前将主线程运行到最后。
sys.exit(( 不起作用,因为它与引发 SystemExit 异常相同。在线程中引发异常只会退出该线程,而不是退出整个过程。
示例代码。由python3 thread.py; echo $?
在 ubuntu 下进行测试。 返回代码按预期为 1
import os
import sys
import time
import threading
# Python Threading Example for Beginners
# First Method
def greet_them(people):
for person in people:
print("Hello Dear " + person + ". How are you?")
os._exit(1)
time.sleep(0.5)
# Second Method
def assign_id(people):
i = 1
for person in people:
print("Hey! {}, your id is {}.".format(person, i))
i += 1
time.sleep(0.5)
people = ['Richard', 'Dinesh', 'Elrich', 'Gilfoyle', 'Gevin']
t = time.time()
#Created the Threads
t1 = threading.Thread(target=greet_them, args=(people,))
t2 = threading.Thread(target=assign_id, args=(people,))
#Started the threads
t1.start()
t2.start()
#Joined the threads
t1.join() # Cannot remove this join() for this example
t2.join()
# Possible to reach here if join() removed
print("I took " + str(time.time() - t))
信用:示例代码是从 https://www.simplifiedpython.net/python-threading-example/复制和修改的