Python Thread and Processes----Python开发技术详解

来源:互联网 发布:淘宝客建站程序 编辑:程序博客网 时间:2024/04/29 06:38

 

General knowledge:

 

1.进程是资源管理的最小单元,线程是程序执行的最小单元

2.进程是重量级的,在进程中需要处理的问题有进程间通信、临界区管理和进程调度等。这些特性使得生成一个新的进程的开销比较大

 线程是轻量级的,线程之间共享许多资源,容易进行通信,生成一个线程的开销比较小,但是线程会遇到如死锁、数据同步和实现比较复杂等问题

3.Python使用了全局解释器锁(Global Interpretor lock,GIL)和队列的模式,所以使得在实现方面的复杂度相对较低,但是由于GIL的存在使得Python的解释器不是线程安全的。因为当前线程必须持有这个全局解释器锁,从而可以安全的访问Python对象。

4.针对I/O受限的程序,可以使用多线程来提高程序性能。

对于CPU受限的程序,使用多线程是没有办法提高效率的提升,建议使用进程或者混合进程和线程的方法来实现。

5.Python中对于进程和线程处理的支持

相关的模块:os/sys,subprocess,signal,threading

Os/sys模块中相关的函数:popen,system,abort/exit,exec家族

Processes

1.创建进程

 system() function & exec() family function

                                Exec{execl/execle/execlp/execv/execve/execvp/execvpe}

                                System函数实际上是调用系统内置的命令行程序来执行命令,在执行之后,会将控制权返回给Python进程

                                Exec()执行完命令后将接管python进程

2.终止进程

                Sys.exit(value):一种温和的终止进程方式,在程序退出之前会执行一些清理操作,同时将返回值给调用进程(一般是操作系统),调用函数通过检查value的值进行操作~

                os.abort():暴力退出,直接发送进程终止信号给进程

3. 使用的模块:subprocess,类:Popen

                ClassPopen(args,bufsize=0,executable=None,stdin=None,stdout=None,stderr=None,

Preexec_fn =None,close_fds=False,shell=False,cwd=None,env=None,universal_newlines=False

,startipinfo=None,creationflags =0)

Wait()

Communication()

Subproess.call()

Subprocess.check_call()

4.进程间的信号机制signal module

通俗的讲,就是遇到什么样的情况做什么样的处理

Example

import subprocess

import signal

 

def signal_handler(signum,frame):

    print "...."

 

signal.signal(signal.SIGINT,signal_handler)

 

pingP = subprocess.Popen(args = 'ping -n 4www.sina.com.cn', shell = True)

pingP.wait()

print pingP.pid

print pingP.returncode

signal模块中提供了一个使用的函数getsignal,用来查询特定信号所关联的信号处理函数,返回值是一个可调用的python对象,或者是SIG_IGNSIG_DFLNone中的一个

信号的使用规则:

1)信号的支持和实现在不同的系统上面是不一样的,所以有些程序在不同的系统上面表现可能会不一样

2)除了SIGCHLD信号(如果信号集支持的话)以外,信号处理函数一旦被设置后就不会改变,除非显式地重新设置

3)没有办法在临界区临时的屏蔽掉信号

4)尽管信号是一种异步的信息传递机制,但是实际上在进行长时间计算的时候使用信号,可能会产生一定的延时

5)当程序在执行I/O操作的时候收到信号中断,有可能使得在信号处理函数执行完毕后触发异常,或者直接触发异常

6Python中的信号是使用C语言实现的,而C的信号处理函数总是会返回的,所以没有必要去关注同步错误,如SIGFPESIGSEGV

7Python已经为部分的信号注册了处理函数,如在前面的SIGINT信号,默认情况下,就会转化为KeyboardInterrupt

8)当信号和线程同时使用的时候,必须要小心。如果使用不当,可能会出现意想不到的问题

在同时使用信号和线程的时候,特别要记住的是:总是在主线程中执行signal()函数,所以不能使用线程作为线程间的通信方式

Thread

多线程概述

1.多线程使得系统可以在单独的进程中执行并发任务。

2.线程的状态:就绪,运行,休眠,中止

生成和终止线程

Thread中常用的方法:

start_new_thread,exit,get_ident,allocate_lock,interrupt_main,stack_size

threading.Thread:

start:开始运行生成的线程实例

run:重载此方法,作为线程的运行部分

join:等待线程的结束

getName,setName,isAlive

isDaemon:返回线程的是否后台运行标志

setDaemon:设置线程的后台运行标志

管理线程和线程之间的同步:

1.每个线程中的局部变量:

self.local  =threading.local()

self.local.variableName = …

2.线程之间的同步:锁机制、条件变量、信号量、同步队列

1.临界资源和临界

所谓的临界资源就是不能共享的资源,所谓的临界区就是在使用临界资源的代码段

在实际操作中对于临界区的访问需要遵循如下的访问原则:

1)空闲让进2)忙则等待3)有限等待4)让权等待

4)当线程不能够进入临界区使用临界资源的时候,表示此时有线程在使用临界资源。此时该线程应该自己阻塞,并释放CPU资源

2.锁机制

低层次thread锁机制版本:self.lock =thread.allocate_lock()àacquireàrelease

高层次threading锁机制版本:self.lock=threading.Lock()àacquireàrelease

3.条件变量:通过允许线程阻塞和等待线程发送信号的方式弥补了锁机制中的锁状态不足的问题

wait:使线程处于阻塞状态

notify,notify-All

4.信号量

主要用在需要对有限的资源进行同步的时候,信号量内部维护了对于资源的一个计数器,用来表示还可用的资源数

Acquire:获取资源,将内部计数器减1;如果内部计数器为0,则等待

Release:释放资源,将内部计数器加1

5.同步队列:使用同步队列的入队和出对来有效的实现数据同步

Qsize,Empty,Full

Put,Put_nowait

Get,Get_nowait

Task_done

Join

 

 

 

原创粉丝点击