Python的穿线不工作,因为它应该工作

问题描述:

我下面布凯的Python tutorial在他线程的视频,他得到这个输出(不完全):Python的穿线不工作,因为它应该工作

Send out messages 
Send out messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Receive messages 
Receive messages 

但是当我试着写类似的代码,我得到这样的输出:

Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 

这里是我的代码:

# threading 

import threading 

class Messenger(threading.Thread): 
    def run(self): 
     for _ in range(10): # '_' is used when you want to run a for loop but don't care about the varialble 
      print(threading.currentThread().getName()) 

x = Messenger(name='Sending messages...') 
y = Messenger(name='Receiving messages...') 

x.start() 
y.start() 

那么,有没有什么wron g与我的代码或这里有什么不对,以及为什么我的输出与Bucky的输出不同?

+0

我认为这是因为Python的gil(全局解释器锁定)属性,即它一次只能执行一个线程https://docs.python.org/2/glossary.html#term-global-interpreter -lock –

+2

运行它不同的时间,我得到两种输出。它主要取决于操作系统何时为线程分配时间。你可以添加一个小小的'sleep'来看看它发生的更慢 - 并且你会注意到你的每个线程执行的顺序不能保证。这就是使用它们的重点:它们独立运行。如果执行顺序对您很重要,请勿使用线程或使用某种同步。 –

+0

@ThierryLathuille我测试了代码9-10次,每次得到相同的输出。我知道使用线程有什么意义,这就是我使用它的原因。你对上面akhilviswam给出的'gil'观点有什么看法?如何禁用它? –

使用线程时,不保证输出顺序。执行线程的顺序取决于您的操作系统。我的系统上有完全不同的输出。