Python的Threading多线程处理(IO密集型处理)

来源:互联网 发布:pro tools mac 破解版 编辑:程序博客网 时间:2024/05/23 15:06

情景:

最近项目需要在分布式系统上读取Apache服务器的log来分析web service访问的log,最后找出错误的原因,并整合显示出来。因此需要多次使用多线程操作,首先是读取很多天的几种log文件,然后还需要多线程在多个node之间采集log,等待ssh返回。而刚学习python时间不长,所以系统的学习了一下threading模块。

基础:

1. 线程的基础知识介绍:

这里推荐python线程指南(http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html)

     进程与线程区别(http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html)

下面是我阅读后的感悟以及一些笔记:

1) - 进程线程的概念:进程是在执行的程序,拥有自己独立内存空间(进程空间)。进程所包含的一个或多个执行单元称为线程,同一个进程内部的线程之间共享空间。

2) - 进程与线程的联系与区别:

a) 线程隶属于一个进程,并且只能访问进程拥有的资源,因此进程是资源分配的基本单位,线程是独立运行和独立调度的基本单位

b) 进程的执行是线状的,尽管中间可以暂停或者中断,但是此时所有的进程资源都要保护起来,一个进程崩溃不会对其他进程产生影响。线程可以多个并发,相互间共享资源,一个线程死去,会导致整个进程死掉。因此多进程的程序比多线程程序更加的健壮,多进程的缺点在于浪费资源。

3) - 线程状态与状态的切换:调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

4)-线程实现的方法:

a) - 调用Thread类的方法,对将函数名作为target参数传递,即调用函数

b) - 继承Thread类,重写run()方法,在run方法中执行线程的操作


2. python的threading模块介绍:

threading是在JAVA多线程的子集。

包括有:

1) threading.Thread 类负责线程控制,可以通过该类派生出子类,Thread类定义的方法如下:

__init__(self, group=None,target=None,name=None,args=(),kwargs=None, verbose=None)

group:保留字args是target调用函数的非关键字参数,以tuple形式保存
target:可调用的函数名kwargs是target调用函数的关键字参数,以dict形式保存
name:定义thread的名字*如果多以上两个参数不明白,可以看关键字参数与非关键字参数

getName(self): 获得当前线程的名称

is_alive = isAlive(self):检查线程是否是运行态,只有在run()运行过程中才会返回true,即启动后终止前

isDaemon():是否开启守护

join(self, timeout = None):等待直到线程结束,join()会阻塞主线程运行,等待其他线程运行完成,或异常导致结束,又或者timeout退出

如果没有给出timeout参数,则主线程一直等待直到其他线程结束。一个线程可以被join很多次。

当线程死锁、线程没有调用start()方法就join()等情况发生时,会有RuntimeError异常报出。

run(self):执行方法,可以重写此方法后使用线程。

setDaemon(self, daemonic):声明进程为守护进程,必须在start()方法之前设置,当没有非守护线程正在运行时,线程运行完将直接结束程序。守护线程的初始值是继承创建线程的主线程来的,由于主线程是非守护线程,因此,默认的守护线程设置是False。

我对守护线程的理解是:守护线程(线程isDaemon() = True)是和user线程(线程isDaemon() = False)一起运行的进程。 这里还是会confuse,待我研究一下和join的区别

setName(self, name):设置线程的名字

start(self)‘:设置线程开始工作,多次调用start()方法会导致RuntimeError异常

2)方法介绍:


(1)BoundedSemaphore(*args, **kwargs):信号量函数

待续,研究Daemon中,发现之前理解是有问题的。。。

0 0