V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
UN2758
V2EX  ›  Python

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

  •  
  •   UN2758 · 2021-11-05 10:24:39 +08:00 · 2343 次点击
    这是一个创建于 893 天前的主题,其中的信息可能已经有所发展或是发生改变。

    面试遇到面试官问:假如有两个 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
    
    9 条回复    2021-11-08 11:23:30 +08:00
    AlohaV2
        1
    AlohaV2  
       2021-11-05 10:32:07 +08:00   ❤️ 1
    我感觉你回答的没错——这是内核调度器的机制?只要调度器不被设置成实时模式,那应该就是分时间片的吧...

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

    https://www.freertos.org/RTOS-task-priority.html
    CRVV
        6
    CRVV  
       2021-11-05 11:09:27 +08:00   ❤️ 1
    这个实验设计有问题
    1. > 会新建一个文件,两次都新建文件的话是两个进程分别在写自己的文件,要用 >>
    2. python 的 stdout 有 buffer ,直接这么执行不太容易看出来结果,应该用 python -u 把 buffer 关掉
    3. 原来说的死循环进程同时运行在单核 cpu 上,指的应该是纯粹的计算任务,不包含 io 的那种死循环,这个实验都在写文件了,放 rtos 上也会被调度的
    whoosy
        7
    whoosy  
       2021-11-05 17:37:11 +08:00
    肯定会切换执行的 python 的进程切换是交给操作系统去管理 基于切换算法进行调度 时间片只是一个维度
    UN2758
        8
    UN2758  
    OP
       2021-11-08 10:37:52 +08:00
    @AlohaV2 #1 在 linux 下,通过 multiprocess 执行两个多进程和通过 shell 执行两个单独的 python 命令有什么区别?我想到的,前者通过 fork 的方式产生,子进程会有父进程 pid,后者 ppid 是 1
    AlohaV2
        9
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1104 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:40 · PVG 02:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.