python教程之十二多线程

白癜风治疗目标 http://disease.39.net/yldt/bjzkbdfyy/6195089.html

进程与线程

机器分配资源(包括内存、CPU等)的最小单位是进程,任务调度采用的是时间片轮转的抢占式调度方式。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成,进程由内存空间和一个或多个线程组成,以下是进程与线程的区别。

1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间及一些进程级的资源,某进程内的线程在其他进程不可见;

4.调度和切换:线程上下文切换比进程上下文切换要快得多;

python线程

_thread模块

_thread模块创建线程的方式是通过start_new_thread方法。

说明:start_new_thread会启动一个新线程,同时返回线程的句柄。有两个必传参数:函数和tuple类型的参数,可选参数:关键字参数,字典类型。当函数执行完后线程退出,我们获取不到返回结果。线程抛出不可预期的exception线程也会退出。除非遇到SystemExit否则堆栈信息都会打印出来。

案例:

importrandom

import_thread

defproduce(threadName,things):

count=random.random()#产生随机数

things.append(count)#将随机数放入工厂数组things里

print(%s:%d个%(threadName,len(things)))#打印线程名,数组大小

#function是produce,函数produce需要两个参数:threadName和things

thread1=_thread.start_new_thread(produce,(1,things))

thread1#执行线程返回的句柄是一个非0数值

thread2=_thread.start_new_thread(produce,(2,things))

thread2

threading模块

threading模块创建线程是通过重写父方法run,线程执行start()方法,见如下案例。

执行结果如下:

执行完后,我们继续执行下面命令,相应结果和对应的解释见下图。

线程同步

多线程可以同时启动多个任务处理业务需求,提高系统并发性,节省业务处理时间,这就有一个问题,多个线程对同一个对象处理时,要避免产生脏数据。

线程同步尤其体现在金钱的处理上,比如银行存款和取款,假设某个账号的存款额是accountNum,当同时有两个操作对这个accountNum进行操作,我们必须保证同一时刻只能有一个线程对accountNum操作,这时可以使用Thread的Lock和Rlock实现简单的线程同步,他们都有acquire方法和release方法。

这里引入了锁的概念-锁定和未锁定。某个线程对accountNum操作前,对它加锁,这样其他线程就不能再操作accountNum,线程处理完后会对accountNum解锁,这样其他线程就可以继续访问和操作accountNum.我们通过下面的案例来学习锁的使用。

结果如下:

总结

本文简单介绍了多线程的一些概念,同时介绍多线程的基本使用方法。多线程领域内还有很多其他知识,比如信号量、线程优先级设置、线程队列等,更深入的知识大家可以自行学习,欢迎交流!




转载请注明:http://www.aierlanlan.com/cyrz/3398.html