视频教程下载链接:​​http://pan.baidu.com/s/1pKWYYE3​​​ 配套教程下载:​​​http://pan.baidu.com/s/1qYdI6q4​​ 这节课,我们一起来讨论线程,首先,我们需要理解什么是线程?它有什么用?到目前为止,我们都是以一种固定的流程来编写计算机程序,但是有时候,一个程序在一个时间段中如果能同时处理多个任务将会更加有效率,更加充分的利用计算机资源,那么如何实现这种同时处理多个任务的功能呢?我们把这种技术称为多线程。这里需要提醒大家的是:在大部分时候,同时处理多个任务并不是好的方式,因为如果你编写的程序需要进行大量计算时,这种多任务处理的方式往往会得到错误的结果,引入很多无法预知的bug,这个时候单线程是最好的选择,所以大部分时候,我们并不需要多线程。 所以,当我们要构建一个多线程应用程序时,要非常小心,那么为什么我们要学习多线程呢?这是因为当我们构建一个聊天应用程序时,这个时候就需要使用到多线程了,一个线程用于发送信息,另一个用于接收信息。所以,当你用微信和其他人聊天的时候,你不需要发送了消息之后才能接受消息,发送和接收消息是2个线程,它们是互相独立,互不干扰的,所以这样才能够支持我们同时发送和接收消息的需求。 所以现在,我们来看看如何创建线程!首先我们需要先包含threading这个模块,有了这个模块之后,我们就可以把模块中的类当做基类,从而创建一个线程。

import threading
class wxMessenger(threading.Thread):

这样,我们这个wxMessenger类就拥有了很多Thread类中内建的功能了,我们首先来为这个类创建一个函数run,你看这里会自动的弹出来,说明它是继承过来的线程类Thread中已有的函数,它会在每次启动线程对象时自动被调用,现在我们就来丰富这个函数:

def run(self):

这里我们创建一个循环10次的循环,每一次循环都将当前的线程名称输出出来:

for x in range(10):
print(threading.current_thread().getName())

接下来我们就来创建2个不同名称的线程,然后调用run函数将这两个线程的名称打印出来。 所以首先,创建线程x,然后将这个线程命名为“发送消息”,这里当我输入n时,它会自动弹出name=,这个name是线程类Thread内置的一个变量,表示线程的名称,所以我们在构造时将它赋值为“发送消息”,同样,我们还可以创建一个名称为接收消息的线程

x = wxMessenger(name= "发送消息")
y = wxMessenger(name= "接收消息")

现在我们已经创建了2个线程。我们自定义的线程只有一个函数run(),所以你可能会直接通过这个线程调用run函数,但是并不是这样的,当我们要启动一个线程时,首先应该调用线程的start函数,然后start函数中会对run函数进行调用,所以这里我们只需要调用2个线程的start函数:

x.start()
y.start()

所以这个程序和其他的单线程应用程序好像并没有什么不同啊?我们运行一下就知道: 图 7‑18 所以,按照正常的逻辑,当我们创建一个对象时,程序会从上往下按顺序运行,比如这里的x.start(),它就应该走到run函数里,执行10次发送消息,然后在执行到y.start(),接着输出10次接收消息,所以按照通常的套路,这里应该先输出10次发送消息,在输出10次接收消息。 但是我们可以看这里的运行结果,并不和我们想象的一样,这就是线程对象不一样的地方,对于线程来说,并不需要等到当前这个线程执行完成后,才可进行下一步操作,它可以并发的执行,所以x和y线程是可以同时执行的,像这里,启动了几个发送消息后,然后又跳转到接收消息。也就是说x线程还没有完全执行结束,y线程就开始执行了。所以这样如果你的cpu是多线程的,就可以更大程度的利用计算机的资源。所以如果你要编写一个需要并发执行的应用程序,那么多线程是非常有用的功能。 更多精彩内容尽在视频中!