在python中启动和暂停进程

2024-04-20 03:01:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个计算斐波那契数的函数。我正在尝试添加一个特性,该特性发送一个信号,指示我需要暂停正在运行的函数。一旦我得到信号,我就把迄今为止计算出的所有数字都存储起来。你知道吗

当用户想要恢复该功能时,我可以加载文件并从停止的位置开始计算。你知道吗

这是我的密码

MAX = 100000
fibo_series = [0] * MAX
import pickle

def fib(start_value=0, stop_value=1000, stop_signal=False):
    if not stop_signal:
        for i in range(start_value, stop_value):
            if i == 0:
                fibo_series[i] = 0
            elif i == 1 or i == 2:
                fibo_series[i] = 1
            else:
                fibo_series[i] = fibo_series[i-1] + fibo_series[i-2]
        return fibo_series[i]
    else:
        with open('fibo_series.pkl', 'wb') as f:
            pickle.dump(fibo_series, f)

def reload_fib():
    with open('fibo_series.pkl', 'rb') as f:
        fibo_series = pickle.load(f)
    start_value = fibo_series[1:].index(0) + 1
    stop_value = len(fibo_series)
    return fib(start_value, stop_value, stop_signal=False)

我不知道的部分是,一旦函数开始运行,如何使用这个stop_signal。函数启动后,值stop_signal被锁定。我知道暂停一个函数的唯一方法是终止它,这不是我想做的。你知道吗

我如何做到这一点?你知道吗


Tags: 函数falsesignalif信号valuedef特性
1条回答
网友
1楼 · 发布于 2024-04-20 03:01:24

我不确定停止和运行的条件是什么,但是一个简单的解决方法是为这两个函数使用一个全局变量。这并不比使用线程库的锁好,但是如果您的工作只是使用一个进程,并且不需要复杂度,那么您可以尝试。你知道吗

import threading
import time


MAX = 100000
fibo_series = [0] * MAX
import pickle

stop_signal = False
def fib(start_value=0, stop_value=1000):
    for i in range(start_value, stop_value):
        if (not stop_signal):
            print('here', i)
            time.sleep(1)
            if i == 0:
                fibo_series[i] = 0
            elif i == 1 or i == 2:
                fibo_series[i] = 1
            else:
                fibo_series[i] = fibo_series[i-1] + fibo_series[i-2]
        else:
            break
    return fibo_series[i]
    print('exiting... stop_signal: ', stop_signal)
    with open('fibo_series.pkl', 'wb') as f:
        pickle.dump(fibo_series, f)

def reload_fib():
    with open('fibo_series.pkl', 'rb') as f:
        fibo_series = pickle.load(f)
    start_value = fibo_series[1:].index(0) + 1
    stop_value = len(fibo_series)
    global stop_signal
    stop_signal = False
    return fib(start_value, stop_value)

x = threading.Thread(target=fib )
x.start()
time.sleep(10)

stop_signal = True

print('finished...')

然后,每当用户想要停止执行时,就可以设置全局变量stop_signal=True

输出为:

here 0
here 1
here 2
here 3
here 4
here 5
here 6
here 7
here 8
here 9

finished...

我希望这有帮助。你知道吗

相关问题 更多 >