我正在学习python 3,我看了这篇关于线程的教程:
我测试了示例代码,但由于某种原因,结果有点奇怪。
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
有人可以向我解释为什么结果会这样打印? 感谢您提供的任何帮助!
答案 0 :(得分:2)
当我运行你的代码片段时,我实际上得到了不同的结果。可能出现的情况是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 Scheduler的部分:
每当CPU变为空闲时,它就是CPU Scheduler的工作( a.k.a.短期调度员)从中选择另一个过程 准备好下一个队列。
就绪队列的存储结构和用于执行的算法 选择下一个进程不一定是FIFO队列。有 几种可供选择的替代品,以及众多可调节的 每个算法的参数,这是本文的基本主题 整章。