gpt4 book ai didi

Python 使函数始终使用线程而不调用 thread.start()

转载 作者:行者123 更新时间:2023-12-04 07:49:08 24 4
gpt4 key购买 nike

基本上我想做的是有一个函数,无论何时调用它,它都在一个单独的线程上执行。我不想调用 thread.start(),因为它会立即执行。

我有以下 python 脚本。我正在为我的 GUI 使用 PyQt5。每当按下一个按钮时,我想在一个单独的线程上执行一个长时间运行的函数。这是代码:

from PyQt5 import QtWidgets, uic
import time


def longRunningFunction():
time.sleep(10)


app = QtWidgets.QApplication([])
dlg = uic.loadUi("app.ui")

dlg.button_to_click.clicked.connect(longRunningFunction)

dlg.show()
app.exec()

当我向程序添加线程时,该函数在 thread.start() 上执行。这是下面的代码,添加了线程:

from PyQt5 import QtWidgets, uic
import time
import threading


def longRunningFunction():
time.sleep(10)


app = QtWidgets.QApplication([])
dlg = uic.loadUi("app.ui")

dlg.button_to_click.clicked.connect(longRunningFunction)

thread = threading.Thread(target=longRunningFunction)
thread.start()

dlg.show()
app.exec()

让函数在调用时始终使用单独线程的最佳方法是什么,这样 GUI 就不会死机?这个函数会在运行时连续调用,每分钟调用几次。这个函数也将比示例复杂得多。它将使用来自其他自定义 python 脚本的多种方法,并且还会运行一个 websocket 连接。

最佳答案

TLDR:定义一个装饰器,在函数被调用时创建并启动一个线程。


增强函数/类的功能通常使用装饰器来完成。这是一个可调用函数,它接收一个函数/类,并用所需的功能包装或替换它。可以在函数/类的定义上使用 @ 语法或稍后通过常规调用来应用装饰器。

此用例的简单装饰器仅接收可调用对象 (func) 并将其包装在一个使用线程运行可调用对象的新函数中。

import threading
import functools


def threaded(func):
"""Decorator to automatically launch a function in a thread"""
@functools.wraps(func)
def wrapper(*args, **kwargs): # replaces original function...
# ...and launches the original in a thread
thread = threading.Thread(target=func, args=args, kwargs=kwargs)
thread.start()
return thread
return wrapper

当使用 @ 语法定义新函数时,可以应用此装饰器:

@threaded
def long_running_function():
time.sleep(10)
print("Done")

long_running_function()
print("started")

如果函数已经定义或必须使用线程和不使用线程,装饰器也可以通过调用它来应用:

dlg.button_to_click.clicked.connect(threaded(longRunningFunction))

关于Python 使函数始终使用线程而不调用 thread.start(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67071870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com