如何在Python函数外部停止函数的执行?

5
所以我有一个使用的库,在我的一个函数中调用该库的一个函数,该函数需要很长时间。同时,我有另一个线程在运行,检查不同的条件,如果满足某个条件,我希望取消库函数的执行。
目前,我在函数开始时检查条件,但是如果条件在库函数运行时发生改变,则我不需要它的结果,并希望从中返回。
基本上,这就是我现在所拥有的内容。
def my_function():
    if condition_checker.condition_met():
        return
    library.long_running_function()

有没有一种方法可以每秒运行一次条件检查,并在满足条件时从my_function返回?
我考虑过装饰器、协程,我正在使用2.7版本,但如果只有3.x才能实现这一点,我会考虑切换,只是我想不出如何做到。

我能想到的唯一解决方法就是在长时间运行的函数中定期检查条件是否满足。如果它是某种循环,那么退出循环会很容易,但我相信有更好的解决方案。 - Donkyhotay
2个回答

3
您无法终止一个线程。要么库本身支持取消操作,它会每隔一段时间内部检查一次条件以便在请求时中止,要么您必须等待其完成。
您可以通过子进程调用库而不是线程来实现终止操作,因为可以通过信号终止进程。Python的multiprocessing模块提供了类似于线程的API,用于生成fork并处理IPC,包括同步。
如果通过复制父进程产生的内存占用过大,例如内存足迹,则可以通过subprocess.Popen生成单独的子进程。
很遗憾,我想不到其他方法。

所以在我的函数中,我会使用库函数启动一个子进程,然后等待条件检查器中的条件被满足(然后停止库函数),或者等待长时间运行的函数完成,然后再从我的函数中返回。我认为这样可以实现,谢谢。 - user1079328

1
通常,我认为您希望在单独的线程中运行long_running_function,并偶尔将其信息报告给主线程。 此帖子在wxpython程序中提供了类似的示例。
假设您正在wxpython之外执行此操作,您应该能够使用threading.ThreadPubSub替换wx.CallAfter和wx.Publisher。
它可能看起来像这样:
import threading
import time

def myfunction():
    # subscribe to the long_running_function
    while True:
        # subscribe to the long_running_function and get the published data
        if condition_met:
            # publish a stop command
            break
        time.sleep(1)

def long_running_function():
    for loop in loops:
        # subscribe to main thread and check for stop command, if so, break
        # do an iteration
        # publish some data

threading.Thread(group=None, target=long_running_function, args=())  # launches your long_running_function but doesn't block flow
myfunction()

我没有大量使用pubsub,所以无法快速编写代码,但是它应该能帮助你。
作为一种替代方案,您是否在启动long_running_function之前知道停止条件?如果知道,您可以将其作为参数传递并在内部检查是否满足。

很遗憾,我无法访问long_running函数,虽然在这种情况下我可能可以,但我希望有一个更通用的解决方案,而不涉及修改库。 - user1079328

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接