线程
线程和进程一样,也是为了实现多任务而设计出来的。举个例子:打开微信,可以和多个人同时聊天,这就可以用多线程实现。既然进程和线程都可以实现多任务,为什么还要设计出这两种呢?(在这埋个伏笔)
threading模块
实现线程方法1
python的threading模块提供了实现的线程的方法,在使用方法上和mutiprocessing很相似。
#coding=utf-8
import threading
import time
def do_thread(*args):
print(args)
time.sleep(1)
if __name__ == '__main__':
print('-------------main thread begin---------')
for i in range(5):
t = threading.Thread(target=do_thread,args=(i,))
t.start()
print('-------------main thread over---------')
结果:
-------------main thread begin---------
(0,)
(1,)
(2,)
(3,)
(4,)-------------main thread over---------
上面的例子定义了函数do_thread(*args),主线程中创建了5个线程,具体的语法就是使用threading模块中的Thread类,并将do_thread和元组(i,)作为参数传进去。最后调用start()方法开始线程。分析代码可以看出如果是单线程的方式执行至少需要5秒的时间,采用上述的方法后很快就执行完了。
实现线程方法2
继承Thread类。基本的语法和进程差不多,其中self.name获取的当前线程的名字,也可以使用getName()方法获得。
#coding=utf-8
import threading
import time
class MyThread(threading.Thread):
def run(self):
time.sleep(1)
print('thread name is:%s' % (self.name))
if __name__ == '__main__':
print('-------------main thread begin---------')
for i in range(5):
t = MyThread()
t.start()
print('-------------main thread over---------')
结果:
-------------main thread begin---------
-------------main thread over---------
thread name is:Thread-3thread name is:Thread-2
thread name is:Thread-4
thread name is:Thread-1thread name is:Thread-5
以上两种实现线程的方式和进程很相似,和进程同样有join()等方法。
为什么要有进程和线程两种实现多任务的方式呢?借用操作系统的一句话:进程是操作系统分配资源的一种单位,线程是操作系统调度的基本单位。从进程和线程占用资源的角度理解,进程占用的资源比线程更多,一个进程可以创建出多个线程,这几个线程共享来自与当前进程的资源,这一点在多线程访问全局变量时格外明显。
总结:
无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式,如sleep(),join()。