线程和进程简介
- 应用程序和进程以及线程的关系?
- 一个应用程序里可以有多个进程,一个进程里可以有多个线程 最原始的计算机是如何运行的?
- CPU是什么?为什么要使用多个CPU?
- 为什么要使用多线程?
- 为什么要使用多进程?
- java和C#中的多线程和python多线程的区别?
- python多线程和傻缺的GIL python
- 如何让程序真正的实现同时运行?
- 线程和进程的选择:计算密集型和IO密集型程序。(IO操作不占用CPU)
进程的开销通常比线程昂贵, 因为线程自动共享内存地址空间和文件描述符. 意味着, 创建进程比创建线程会花费更多
在执行一些sleep/read/write/recv/send这些会导致阻塞的函数时,当前线程会主动放弃GIL,然后调用相应的系统API,完成后再重新申请GIL。因此,GIL也并不是导致Python的多线程完全没用,在一些IO等待的场合,Python多线程还是发挥了作用,当然如果多线程都是用于CPU密集的代码,那多线程的执行效率就明显会比单线程的低。
多线程开发
threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。
threading模块提供的类:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。
threading 模块提供的常用方法:
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
threading 模块提供的常量:
threading.TIMEOUT_MAX 设置threading全局超时时间。
Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():
1 #coding:utf8 2 3 import threading 4 import time 5 6 #方法一,将要执行的方法作为参数传给Thread的构造方法 7 def action(arg): 8 time.sleep(1) 9 print 'the arg is:%s\r' %arg 10 time.sleep(1) 11 12 for i in xrange(3): 13 t = threading.Thread(target=action,args=(i,)) 14 t.start() 15 16 print 'main_thread end!'