面试遇到的 Python 多进程死循环问题求解

2021-11-05 10:24:39 +08:00
 UN2758

面试遇到面试官问:假如有两个 python 死循环进程同时运行在单核 cpu 上,会有一个进程永远不会执行吗?为什么? 我回答:不会,时间片到期后会切换。

感觉我回答的有问题,于是设计实验想验证一下,新建一个 python 文件,在两个 shell 分别执行,给不同的参数并将输入重定向到同一文件中,这样设计有问题吗? 代码如下:

import sys
if __name__=="__main__":
	while True:
    	print(sys.argv[1])

执行命令:

nohup python 1.py pid1 >./temp.out
nohup python 1.py pid2 >./temp.out
2353 次点击
所在节点    Python
9 条回复
AlohaV2
2021-11-05 10:32:07 +08:00
我感觉你回答的没错——这是内核调度器的机制?只要调度器不被设置成实时模式,那应该就是分时间片的吧...

如果想验证的话,可以利用 taskset 命令让进程在同一 CPU 核上运行(当然开个单核虚拟机也可以)。
分配多进程也不必用在 bash 里搞,查一下 multiprocessing 模块吧。
ai277014717
2021-11-05 10:37:30 +08:00
操作系统要是不调度呢。例如实时操作系统。
UN2758
2021-11-05 10:47:10 +08:00
@AlohaV2 #1 这个回答应该是对应非实时的操作系统,面试官的潜台词是指我们常用的 Linux 和 win 系统
UN2758
2021-11-05 10:50:47 +08:00
@ai277014717 #2 脑子里考虑到了实时操作系统的情况,但是书上好像没有讲,我思路就卡住了
CRVV
2021-11-05 11:04:28 +08:00
实时操作系统指的是严格按照进程优先级来调度,在 cpu 上执行的进程一定是优先级高的。
如果两个进程的优先级不同,那么只有一个在执行。
如果优先级相同,也是一样的分时间片执行。

https://www.freertos.org/RTOS-task-priority.html
CRVV
2021-11-05 11:09:27 +08:00
这个实验设计有问题
1. > 会新建一个文件,两次都新建文件的话是两个进程分别在写自己的文件,要用 >>
2. python 的 stdout 有 buffer ,直接这么执行不太容易看出来结果,应该用 python -u 把 buffer 关掉
3. 原来说的死循环进程同时运行在单核 cpu 上,指的应该是纯粹的计算任务,不包含 io 的那种死循环,这个实验都在写文件了,放 rtos 上也会被调度的
whoosy
2021-11-05 17:37:11 +08:00
肯定会切换执行的 python 的进程切换是交给操作系统去管理 基于切换算法进行调度 时间片只是一个维度
UN2758
2021-11-08 10:37:52 +08:00
@AlohaV2 #1 在 linux 下,通过 multiprocess 执行两个多进程和通过 shell 执行两个单独的 python 命令有什么区别?我想到的,前者通过 fork 的方式产生,子进程会有父进程 pid,后者 ppid 是 1
AlohaV2
2021-11-08 11:23:30 +08:00
@UN2758 multiprocessing 可以指定以哪种模式产生新进程( Unix 默认是 fork )
参考 https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/813213

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX