python-3.x – Python 3 |线程很奇怪

我正在学习
python 3,我看了这个关于线程的教程:

https://www.youtube.com/watch?v=WaXK8G1hb_Q&index=33&list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_#t=365.299172

我测试了示例代码,但由于某种原因,结果有点奇怪.

import threading

class Messenger(threading.Thread):
    def run(self):
        for _ in range(10):
            print(threading.currentThread().getName())


m1 = Messenger(name="Send Messages")
m2 = Messenger(name="Receive Messages")
m1.start()
m2.start()

我期待程序以一种随机顺序打印出“发送消息”和“接收消息”,但这发生了什么,我不太清楚为什么:

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

Send MessagesReceive Messages

有人可以向我解释为什么结果会这样打印?
感谢您的帮助!

最佳答案 当我运行你的代码片段时,我实际上得到了不同的结果.可能出现的情况是CPU在您发布的运行中以“正确”的顺序安排所有线程,但如果您继续多次运行它将产生不同的结果.这是正常的线程行为,因为CPU基本上决定了每个进程何时运行.

我还要确保你运行的是你发布的确切代码,因为我的输出被新行字符分隔,而你的输出似乎不是.

Send Messages
Send Messages
Receive Messages
Send Messages
Send Messages
Send Messages
Send Messages
Receive Messages
Receive Messages
Send Messages
Receive Messages
Send Messages
Receive Messages
Send Messages
Receive Messages
Send Messages
Receive Messages
Receive Messages
Receive Messages
Receive Messages

运行此代码:

import threading

class Messenger(threading.Thread):
    def run(self):
        for _ in range(10):
            print(threading.currentThread().getName())


m1 = Messenger(name="Send Messages")
m2 = Messenger(name="Receive Messages")
m1.start()
m2.start()

如果您想了解更多信息:

https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/5_CPU_Scheduling.html

重要的部分是关于CPU调度程序的部分:

>每当CPU变为空闲时,它就是CPU调度程序的工作(
a.k.a.短期调度员)从中选择另一个过程
准备好下一个运行队列.
>就绪队列的存储结构和用于的算法
选择下一个进程不一定是FIFO队列.有
几种可供选择的替代品,以及众多可调节的
每个算法的参数,这是这个的基本主题
整章.

点赞