返回顶部

我用 Python(在 Windows PC 上)编写了一个相当复杂的软件。我的软件基本上启动了两个 Python 解释器 shell。当您双击main.py文件时,第一个 shell 会启动(我想)。在该外壳中,其他线程以下列方式启动: # Start TCP_thread TCP_thread = threading.Thread(name = 'TCP_loop', target = TCP_loop, args = (TCPsock,)) TCP_thread.start() # Start UDP_thread UDP_thread = threading.Thread(name = 'UDP_loop', target = UDP_loop, args = (UDPsock,)) TCP_thread.start() 在Main_thread启动TCP_thread和UDP_thread。尽管这些是单独的线程,但它们都在一个 Python shell 中运行。 该Main_thread还启动子。这是通过以下方式完成的: p = subprocess.Popen(['python', mySubprocessPath], shell=True) 从 Python 文档中,我了解到这个子进程在单独的 Python 解释器会话/shell 中同时运行(!)。在Main_thread这个子完全是献给我的GUI。GUITCP_thread为其所有通信启动一个。 我知道事情变得有点复杂。因此,我在此图中总结了整个设置: 在此处输入图像描述 我有几个关于这个设置的问题。我将在这里列出它们: 问题1 [已解决] Python 解释器一次只使用一个 CPU 内核来运行所有线程是真的吗?换句话说,将Python interpreter session 1(从图)运行所有3个线程(Main_thread,TCP_thread并UDP_thread在一个CPU核心)? 回答:是的,这是真的。GIL(全局解释器锁)确保所有线程一次在一个 CPU 内核上运行。 问题2 [尚未解决] 我有办法跟踪它是哪个 CPU 内核吗? 问题3 [部分解决] 对于这个问题,我们忘记了线程,而是专注于 Python 中的子进

1

0/300

评论 1

初生

问: Python 解释器一次只使用一个 CPU 核心来运行所有线程是真的吗? 不,GIL 和 CPU 亲和性是不相关的概念。GIL 可以在阻塞 I/O 操作期间释放,无论如何在 C 扩展中进行长时间的 CPU 密集型计算。 如果一个线程在 GIL 上被阻塞;它可能不在任何 CPU 内核上,因此可以公平地说纯 Python 多线程代码在 CPython 实现中一次只能使用一个 CPU 内核。 问:换句话说,Python 解释器会话 1(从图中)是否会在一个 CPU 内核上运行所有 3 个线程(Main_thread、TCP_thread 和 UDP_thread)? 我不认为 CPython 隐式管理 CPU 亲和力。它可能依赖于操作系统调度程序来选择在哪里运行线程。Python 线程是在真正的 OS 线程之上实现的。 问:或者 Python 解释器是否能够将它们分布在多个内核上? 要找出可用 CPU 的数量: >>> import os >>> len(os.sched_getaffinity(0)) 16 同样,线程是否调度在不同的 CPU 上并不取决于 Python 解释器。 问:假设问题 1 的答案是“多核”,我是否可以通过一些零星的打印语句来跟踪每个线程在哪个核上运行?如果问题 1 的答案是“只有一个核心”,我是否有办法跟踪它是哪一个? 我想,一个特定的 CPU 可能会从一个时隙变为另一个时隙。您可以查看类似/proc//task//status旧 Linux 内核的内容。在我的机器上,task_cpu可以从/proc//stator读取/proc//task//stat: >>> open("/proc/{pid}/stat".format(pid=os.getpid()), 'rb').re

2022-01-10 16:08:17

- 没有更多了 -