python中的网络编程和多进程(四)

线程是操作系统可以调度的最小执行单位, 够执行并发处理。通常是将程序分为2个或多个并发运行 线程,即同时执行多个操作。例如,使用线程同时监视用户并发输入,并执行后台任务等。

1、 进程和线程

进程是操作系统中正在执行的应用程序的一个实例,操作系统吧不同的进程(不同的程序)分离出来。每一个进程都有自己的地址空间,一般情况下,包括文本区域、数据区域和队栈。文本区域存储处理器执行的代码,数据区域存储变量和进程执行期间使用的动态分配的内存;队栈区域存储着活动过程调用的指令和本地变量。

每个进程至少包括一个线程,它从程序开始执行,直到退出程序,主线程结束,该进程也被从内存中卸载。主线程在运行过程中还可以创建新的线程,实习多线程的功能。

线程就是一段顺序程序。但是线程不能独立运行,只能在程序中运行。

不同的操作系统实现进程和线程的方法是不同的,但不多数是在进程中包含线程,windows就是这样。一个进程中可以存在多个进程,线程可以共享进程的资源(比如内存)。而不同的进程之间则是不能共享资源的。

2、 多线程的优点

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

A、 使用线程可以把占据长时间的程序中的任务放到后台去处理

B、 用户界面可以更加吸引人,这样比如用户单击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进程

C、 程序的运行速度可能加快

D、 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种的情况下可以释放一些珍贵的资源如内存占用等。

线程在执行过程中与进程还是有区别的。 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态


3 、线程的状态

在操作系统内核中,线程可以被标记成如下状态

A、 初始化:在创建线程,操作系统在内部会将其标识为初始化状态。此状态只在系统内核中使用

B、 就绪:线程已经准备好被执行

C、 延迟就绪:表示线程已经被选择在指定的处理器上运行,但还没有被调度

D、 备用:表示线程已经被选择下一个在指定的处理器上运行。当该处理器上运行的线程因等待资源等原因被挂起时,调度器将备用线程切换到处理器上运行,只有一个线程可以是备用状态

E、 运行:表示调度器将线程切换到处理器上运行,它可以运行一个线程周期,只有一个线程可以是备用状态

F、 等待:线程可以因为等待一个同步执行的对象或等待资源等原因从内存中移除。一旦其内核堆被加载到内存中,线程就会变成运行状态

G、 过渡:表示线程已经准备好被执行,但它的内核堆已经被从内存中移除。一旦其内核堆被加载到内存中,线程就会编程运行状态

H、 终止:当线程执行完成后,其状态会变成终止。系统会释放线程中的数据结构和资源。


4、 创建线程

Python中使用线程有二种方式:函数或者用类来创建线程对象

4.1 start_new_thread()函数创建线程

调用_thread模板中的start_new_thread()函数来产生新线程。格式如下:

_thread.start_new_thread(function, args[,kwargs])

参数说明如下:

python中的网络编程和多进程(四)

start_new_thread()创建一个线程并运行指定函数,当函数返回时,线程自动结束。也就可以在线程函数中调用_thread.exit(),它抛出SystemExit exception,达到退出线程的目的

python中的网络编程和多进程(四)


执行以上程序输出结果如下


python中的网络编程和多进程(四)

Python通过两个标准模板_thread模板和threading提供对线程的支持。_thread提供低级别的、原始的线程已经一个简单的锁

4.2 Thread类创建线程

threading 线程模板封装了_thread模板,并提供更多功能,虽然可以使_thread模板中start_new_thread()函数创建线程,但一般建议使用threading模板

threading 模板提供了Thread类来创建和处理线程,格式如下:

线程对象 = threading.Thread(target = 线程函数, args=(参数列表), name=线程名, group=线程组)

线程名和线程组都可以省略。

创建线程后,通常需要调用线程对象的setdaemon()方法将线程设置为守护线程。主线程执行完后,如果还有其他守护线程,则主线程不会退出,会被无限挂起;必须将线程声明为守护线程之后,如果队列中的线程运行完了,那么整个程序不用等待就可以退出。

setDaemon()函数的使用方法如下:

线程对象.setDaemon(是否设置为守护线程)

setDaemon()函数必须在运行线程之前被调用。调用线程对象的start()方法可以运行线程

下面是Thread类提供的常用方法

python中的网络编程和多进程(四)

下面是threading模板提供的其他方法

python中的网络编程和多进程(四)

例如:编写自己的线程类myThread来创建对象

python中的网络编程和多进程(四)

以上程序的执行结果如下:

python中的网络编程和多进程(四)


分享到:


相關文章: