完成后,重新启动/跑步/唤醒python线程

发布于 2025-02-01 08:27:18 字数 1974 浏览 3 评论 0原文

从下面的代码中可以看到,我有一个无限的周期“ while(true)”,我想在完成后重新运行python线程,但无需拥有无限的周期。假设“实时”/嵌入,并且不允许无限周期。似乎Sched Library可以提供帮助,但是这与计时事件有关,我想在与警报或时间无关的其他事件后根据需要进行此操作。

感谢您的回答。

from threading import *
from time import sleep
import signal

fd = open("OutputFile.txt","w")
fd_lock = Lock()
event = Event()

def print_letters(file):
    letters = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O']

    while(True):
        event.wait()
        
    #    while(True):
        #fd_lock.acquire
        with fd_lock:
            for letter in letters:
                file.write(letter + ", ")
            file.write("\n")
            file.flush()
        
        #fd_lock.acquire

        event.clear()

    return 0

def print_numbers( file):
    numbers = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15']

    while(True):
        event.wait()

    #    while(True):
        #fd_lock.acquire
        with fd_lock:
            for number in numbers:
                file.write(number + ', ')
            file.write("\n")
            file.flush()        
        
        #fd_lock.acquire

        event.clear()

    return 0

def handler(signum, frame):
    print('Signal handler call signal num',signum)
    if(signum == signal.SIGALRM):
        signal.alarm(1)
        event.set()            

    return 0


if __name__ == "__main__":
    t_pl = Thread(target=print_letters, args=(fd, ))
    t_pn = Thread(target=print_numbers, args=(fd, ))

    t_pl.start()
    t_pn.start()

    #signal.signal(signal.SIGALARM, handler(signum, frame))
    signal.signal(signal.SIGALRM, handler)
    signal.alarm(1)

    while True:
        #kbd = input("Stop wirting to the file [y/n]")
        #disregard this section of the code
        kbd='n'
        if kbd != 'n' and kbd != 'N':
            signal.raise_signal(signal.SIGKILL)          
        else:
            sleep(5)

    t_pl.join()
    t_pn.join()

    signal.alarm(0)

As you can see from the code below I have a infinite cycle "while(True)" and I want to re-run a python thread after it has finished but without the need to having a infinite cycle. Assume "real-time"/embedded and it does not allow infinite cycles. It seems like sched library can help but that is attached to timings events and I want to do it on demand after some other event not related to an alarm or timing.

Thanks for your answers.

from threading import *
from time import sleep
import signal

fd = open("OutputFile.txt","w")
fd_lock = Lock()
event = Event()

def print_letters(file):
    letters = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O']

    while(True):
        event.wait()
        
    #    while(True):
        #fd_lock.acquire
        with fd_lock:
            for letter in letters:
                file.write(letter + ", ")
            file.write("\n")
            file.flush()
        
        #fd_lock.acquire

        event.clear()

    return 0

def print_numbers( file):
    numbers = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15']

    while(True):
        event.wait()

    #    while(True):
        #fd_lock.acquire
        with fd_lock:
            for number in numbers:
                file.write(number + ', ')
            file.write("\n")
            file.flush()        
        
        #fd_lock.acquire

        event.clear()

    return 0

def handler(signum, frame):
    print('Signal handler call signal num',signum)
    if(signum == signal.SIGALRM):
        signal.alarm(1)
        event.set()            

    return 0


if __name__ == "__main__":
    t_pl = Thread(target=print_letters, args=(fd, ))
    t_pn = Thread(target=print_numbers, args=(fd, ))

    t_pl.start()
    t_pn.start()

    #signal.signal(signal.SIGALARM, handler(signum, frame))
    signal.signal(signal.SIGALRM, handler)
    signal.alarm(1)

    while True:
        #kbd = input("Stop wirting to the file [y/n]")
        #disregard this section of the code
        kbd='n'
        if kbd != 'n' and kbd != 'N':
            signal.raise_signal(signal.SIGKILL)          
        else:
            sleep(5)

    t_pl.join()
    t_pn.join()

    signal.alarm(0)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文