【问题标题】:Terminate infinite loop终止无限循环
【发布时间】:2021-06-30 20:00:55
【问题描述】:

我正在尝试创建一个并行运行无限循环并在被告知时退出循环的程序。具体来说,无限循环在square函数中,退出信号在shv='STOP'时给出。当所有进程读取该信号时,将不得不退出无限循环并返回。

问题是即使在发出STOP 信号之后Processes 也不会关闭。

一些注意事项:

  • 与多处理代码的许多实例一样,此代码在终端而不是 IDE 中运行。

代码:

import multiprocessing as mp
import time
import ctypes


def square(x, shv):

    while shv.value != 'STOP':
        time.sleep(3)
        print(shv.value)
    else:
        print('stopped')

    return


if __name__ == '__main__':
    stopphrase = 'STOP'
    proecess_num = 2

    shv = mp.Value(ctypes.c_wchar_p, '')

    processes = [mp.Process(target=square, args=(i, shv)) for i in range(proecess_num)]
    for p in processes:
        p.start()
    print('Mapped & Started')
    print(processes)

    while shv.value != stopphrase:
        inp = input('Type STOP and press Enter to terminate: ')
        if inp == stopphrase:
            shv.value = stopphrase
            time.sleep(2)
    p.terminate()
    print(processes)

由于某种原因,即使我设置了shv.value = stopphrase,这段代码在print(processes) 的两种情况下都给出了以下内容:

[<Process name='Process-1' pid=9664 parent=6084 started>, <Process name='Process -2' pid=10052 parent=6084 started>]

请让我知道有关问题的进一步改进或详细信息。

【问题讨论】:

  • 值不能是字符串,并且由于多处理处理标准输出的方式,您会收到一个不会立即显示的错误。您不能将字符串分配给只能是单个字符的 Value。字符串必须是字符数组。更好的是,在主进程中检查用户输入,然后使用设置为 0 或 1 的数值向子进程发出信号。
  • 你是对的。感谢您!我将相应的字符串更改为字符('STOP' 到 'S' 和 ' ' 到 'a'),所有问题都解决了
  • python 没有像其他语言那样的“char”数据类型,这有点像个陷阱。在 python 中,“char”实际上是长度为 1 的“字符串”。其他语言在“char”和“string”(char 类型的数组)之间有明确的界限
  • @Charalamm 有什么反馈吗?
  • @Artiom 我还没有时间测试它。感谢您的回答,这似乎很有帮助且正确。我会尽快反馈。

标签: python multiprocessing infinite-loop


【解决方案1】:

我认为您的意思是在每个进程上都有一个调用“join()”的循环。

for p in processes:
    p.join()

而不是只对其中一个调用终止。

【讨论】:

  • 但是你已经完成了'shv.value = stopphrase'所以不再有无限循环。
  • 你是对的,但由于某种原因p.join() 不会停止进程,尽管shv.value 正在改变。我将删除我之前的评论。另外,在terminate 和join 两种情况下,'stopped' 都不会打印
  • 由于某种原因问题是ctypes。我将相应的字符串更改为字符('STOP' 到 'S' 和 ' ' 到 'a'),所有问题都解决了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多