【问题标题】:A Process to check if Infinite Loop is still running in Python3检查无限循环是否仍在 Python3 中运行的过程
【发布时间】:2016-05-10 19:54:42
【问题描述】:

在编程概念的帮助下,我无法在以下情况下掌握这一点:

注意:本场景中的所有数据传输都是使用Python3

socket模块通过UDP包完成的
  • 我有一个发送一定数量数据的服务器,假设通过 WiFi 频道发送 300 个数据包

  • 在另一端,我有一个接收器,它使用特定的解码过程来解码数据。这个解码过程是一种无限循环,它在每次迭代时返回布尔值truefalse,具体取决于目前可以忽略的某些方面

粗略的代码片段如下:Python3

incomingPacket = next(bringNextFromBuffer)

if decoder.consume_data(incomingPacket):
    # this if condition is inside an infinite loop
    # unless the if condition becomes True keep
    # keep consuming data in a forever for loop

    print("Data has been received")

目前一切正常,因为服务器和客户端就在附近,并且可以解码数据。但在实际场景中,我想检查上面提到的循环。例如,经过一定时间后,如果上述循环仍处于Forever(Infinite)状态,我想向服务器发送一些东西以重新开始发送数据。 p>

我不太清楚多线程的概念,但是在这种情况下我可以在这里使用线程吗?

例如:

  • 线程一个进程一定的时间,并继续检查decoder.consume_data()函数,如果时间到期并且输出仍然是False,我可以发送一种反馈到服务器在套接字上使用 struct.pack()

当然是网络逻辑,现在需要解决。但是 python 是否能够通过并行线程或其他编程概念监控这个无限循环

注意事项

不幸的是,有问题的接收器是一个哑接收器,即没有指定用户控制。 Receiver 唯一能做的就是解码数据,并可能向服务器发送一个 Feedback 说明是否接收到数据,并且只有在上述 LOOP 为完成。

这里有什么可能的解决方案? (很乐意应要求分享更多信息)

【问题讨论】:

  • 作为摘要:is_running_inf_loop = True ; while True: do_stuff_that_could_stop_loop() ; is_running_inf_loop = False 任何类型的线程检查部分都会归结为这一点,尽管使用某种Lock 而不是布尔值可能会更好。
  • 这是一个相当令人困惑的问题。你到底想在这里实现什么?在 UDP 之上设计和实现可靠的传输协议?
  • 你好@TadhgMcDonald-Jensen 我不知何故得到了这个部分,遗憾的是上面提到的函数是我从别人那里使用的一个模块。如果我理解正确,我会 LOCK 当前的无限状态,当线程执行时,我会 UNLOCK 无限循环。
  • @o9000 在使用 LT-Codes 的无线环境中使用称为 FountainCodes 的 FEC 方法无法实现可靠性。我想提供HARQ(混合ARQ)选项,它将FEC和ARQ结合在一起。还想象一下,其他接收器对数据进行解码,但可能有一个接收器可能需要再次从服务器获取更多数据以解码剩余数据。为此,这个单独的 Receiver 可能 LOCK 当前状态发送一个小的反馈,然后返回 无限状态
  • 我不太清楚,因为我不熟悉这个协议。但是你似乎在这里做的是实现一个带有事件循环的状态机。这是一种非常常见的设计模式。只需要一个线程。对于计时器,请参见 docs.python.org/2/library/socket.html#socket.timeout

标签: python multithreading python-3.x networking


【解决方案1】:

是的,您可以这样做。大概是这样的:

from threading import Thread
from time import sleep

state = 'running'

def monitor():
    while True:
        if state == 'running':
            tell_client()
            sleep(1)  # to prevent too much happening here

Thread(target=monitor).start()

while state == 'running':
    receive_data()

【讨论】:

  • 你好,我会试一试,并给出反馈。谢谢
  • 你好,我可以在这里使用asyncio吗?像要检查的事件循环是否仍在运行?
  • 对不起,我对 asyncio 一无所知。
猜你喜欢
  • 2018-12-19
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2013-07-21
相关资源
最近更新 更多