1.基本概念
- 使用多线程编程,以及类似queue的共享数据结构,这个编程任务可以规划成几个执行特定函数的线程。
- qingUserRequestThread:负责读取客户端输入,该输入可能来自I/O通道,程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中。
- RequestThread:该线程负责从队列中获取请求并进行处理,为第3个线程提供输出。
- ReplyThread:负责向用户输出,将结果传回给用户(如果是网络用户),或者把数据写到本地文件系统或数据库中。
- 进程:执行中的程序。每个进程拥有自己的地址空间,内存,数据栈,以及其他用于跟踪执行的辅助数据。操作系统管理其上的所有进程的执行,并为这些进程合理分配时间。进程也可以通过派生(fork或spawn)新的进程来执行其他任务,不过每个新进程也都拥有自己的内存和数据栈等,所以只能采用进程间通信(PIC)的方式来共享信息。
- 线程:与进程相似,但是在同一个进程下执行的,并共享相同的上下文。可以将他们认为是一个主进程或“主线程"中运行的迷你进程。
- 线程包括开始,执行顺序,和结束三个部分。他有一个指令指针,用于记录当前运行的上下文,当其他线程运行时,他可以被抢占(中断)和临时挂起(睡眠)--这种做法叫做让步
- 全局解释锁:Python的解释器当中,任意时刻只有一个线程会被解释器执行。对Python虚拟机的访问是由全局解释锁(GIL)来控制的,这个锁是用来保证同时只能有一个线程执行。
- 执行步骤:设置GIL
- 切换进一个线程去运行
- 执行下列操作之一:a.指定数量的字节码指令b.线程主动让出控制权(可以调用来完成time.sleep(0))
- 把线程设置回睡眠状态
- 解锁GIL
- 重复上述步骤
- 退出线程:当一个线程完成函数时,他就回退出。还可以通过调用诸如thread.exit()之类的方法,sys.exit()退出,或抛出SystemExit异常来使线程退出。但你不能直接终止一个线程
2.python的threading模块
- Thread:表示一个执行线程的对象
- Lock:锁原语对象
- RLock:可重入锁对象,使单一线程可以再次获得已持有的锁(递归锁)
- Condition:条件变量对象,使得一个线程等待另一个线程满足特定的条件
-
#!/usr/bin/env python import threading def haha(max): for i in range(max): print max def main(): threads =[] n=range(10) for i in n: t=threading.Thread(target=haha,args=(10,)) #实例化Thread对象,把target(函数)和args(参数)传进去,然后获得Thread对象 threads.append(t) for i in n: threads[i].start()#当所有的线程都分配完成之后,通过调用每个线程的start()方法让他们执行 for i in n: threads[i].join()#为每个线程调用join()方法。join()方法将等待线程结束,或者在提供了超时时间的话,达到超时时间。 if __name__ == "__main__": main()