python - 如何安排子流程?

标签 python linux operating-system multiprocessing glibc

场景如下:我有一个父进程生成了几个子进程。现在必须允许每个子进程运行两秒钟(理想情况下是 cpu 时间),之后 parent 让 children sleep 或做一些工作。这个循环继续。此外,一些子流程可能会在两者之间终止。将要产生的子流程是由一些不可信任的人编写的代码。 (这个问题让我想到round robin调度)

我的解决方案和研究:

显而易见的解决方案:让父进程休眠两秒钟,然后唤醒并控制子进程。在这里,我们使用墙时间,每个进程可能无法获得公平的两秒执行时间。

解决方案二:将 prlimit() 与 RLIMIT_CPU 一起使用,并设置一个大的 hardlimit 和 softlimit 最初为两秒。随后软限制可能会提高两秒。然后子进程得到一个 SIGXCPU 信号。

可以为每个进程分配不同的信号(实时信号)(达到 33 的上限)。现在,在收到 SIGXCPU 信号后,必须使用 os.kill() 将分配的信号发送给父级。这里的问题是子进程必须主动向父进程发送信号。子进程可以通过延迟发送信号来获得额外的时间。

解决方案三:在子进程中使用带有 ITIMER_VIRTUAL 的 setitimer()。 SIGVTALRM 信号被发送到子进程。它必须将不同的信号(如上所述)转发给父进程。该解决方案与之前的解决方案存在相同的问题。

三种解决方案都是灾难。我正在寻找更好的解决方案。解释一些最少的代码会非常有帮助。

最佳答案

同样的问题被问到here .

一种可能的解决方案是在 ptrace 下运行子进程(由父进程)。当您这样做时,父级 会收到有关即将发送给其 ptraced 子级的任何信号的通知,并且父级可以决定如何处理这些未决信号(有可能忽略信号,或将其转发给 child ;或终止 child 等)。

The sub-process that are going to be spawned are code written by some untrustable person.

ptrace 解决方案还允许您观察子进程正在做什么,并防止它执行某些系统调用。

如果没有这个,子进程可以fork 并进入 sleep ,不消耗任何执行时间(孙进程消耗无限的 CPU 时间)。

另见 this关于 Linux 下 jail 的文章有些过时。沙盒的当前技术水平似乎是 seccomp-bpf,例如 Firejail .

关于python - 如何安排子流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794973/

相关文章:

c++ - 如何使用 X11 避免图形绘图中的闪烁

assembly - 汇编语言如何依赖于操作系统?

python - Django 表单 ChoiceField 依赖于另一个 ChoiceField

python - 将 DPI 信息存储在 EPS 图像中

linux - page_alloc.c 的内核 BUG

linux - 查找 [主机] : no such host error in Go

python - 是否可以创建一个由另一个列表的一定百分比元素组成的列表?

python - datetime.strptime() 抛出 'does not match format' 错误

操作系统可以为两个不同的进程生成相同的逻辑地址吗?

linux - 使用 USB 端口进行通用打印