【问题标题】:Terminate thread, process, function in python在python中终止线程、进程、函数
【发布时间】:2018-08-13 23:55:45
【问题描述】:

我是 python 的新手,有一段时间我尝试解决特定问题。我有收听和打印无线电帧的功能。为此,我使用的是 NRF24 Lib,整个功能非常简单。关键是我运行这个函数,有时我需要终止它并再次运行。所以在代码中它看起来像

def recv():
    radio.openWritingPipe(pipes[0])
    radio.openReadingPipe(1, pipes[1])
    radio.startListening()
    radio.stopListening()
    radio.printDetails()
    radio.startListening()
    while True:
        pipe = [0]
        while not radio.available(pipe):
            time.sleep(10000/1000000.0)
        recv_buffer = []
        radio.read(recv_buffer)           
        print(recv_buffer)

我从服务器端运行这个函数,现在我想停止它并再次运行?有可能吗?为什么我不能recv.kill()?我阅读了有关线程、多处理的信息,但所有这些都没有给我正确的结果。

我如何运行它:

    from multiprocessing import Process
      def request_handler(api: str, arg: dict) -> dict:
          process_radio = Process(target=recv())

      if api == 'start_radio':
           process_radio.start()
           ...

      elif api == 'stop_radio':
           process_radio.terminate():
           ...
...

【问题讨论】:

  • 如何运行这个函数?您是否明确使用线程?杀死一个 进程 依赖于操作系统,但您可以设置一些信号处理以以其他方式中断该功能,如果不知道它是如何运行的,很难给出建议。
  • @cdarke 这要复杂得多。我有很多功能,这些功能同时运行。我有使用 procbridge 的服务器和客户端应用程序,就像我说的我需要运行这个函数来监听无线电帧,并且不时我需要完全终止它。所以我有服务器端,它一直在等待来自客户端的一些命令。客户端给出运行recv函数的命令,然后我需要使用命令来终止它
  • @cdarke 我需要补充一点,我不能只是 radio.stopListening 因为我使用其他函数来监听其他帧,只需要终止整个函数以避免一些麻烦
  • 您是在使用线程还是这些函数在不同的进程中运行?您使用的是哪种操作系统?
  • @BengBeng:使用您在 cmets 中提供的代码更新 (edit) 您的问题帖子。在 Stack Overflow 上,cmets 是次要的,所有关于问题的信息都应该在问题帖子本身中。

标签: python multithreading multiprocessing kill terminate


【解决方案1】:

没有办法“从外部”停止 Python 线程。如果线程进入等待状态(例如,因为它正在等待 radio.recv() 完成而没有运行),那么您无能为力。

在单个进程中,线程是自治的,您可以做到最好,因此为线程设置一个标志,以便在检查线程时采取行动(通过终止)。

正如您已经发现的那样,您似乎可以终止子进程,但是您会遇到进程如何相互通信的问题。

您的代码和测试并没有提供足够的信息(Python 中似乎有多个 NRF24 实现)来调试您报告的问题。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2021-12-12
    • 2017-02-25
    相关资源
    最近更新 更多