线程和进程简介


 

  • 应用程序和进程以及线程的关系?
  • 一个应用程序里可以有多个进程,一个进程里可以有多个线程 最原始的计算机是如何运行的?
  • 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!'
将要执行的方法作为参数传给Thread的构造方法

相关文章: