day9 python学习随笔

一、threading

问答:

  • 应用程序、进程、线程关系?

  • 为什么要使用多个CPU ?

  • 为什么要使用多线程?

  • 为什么要使用多进程?

  • java和C#中的多线程和python多线程的区别?

  • Python GIL?

  • 线程和进程的选择:计算密集型和IO密集型程序。(IO操作不占用CPU)

1、Python线程

Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time
 
def show(arg):
    time.sleep(1)
    print 'thread'+str(arg)
 
for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()
 
print 'main thread stop'

上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。


更多方法:

  • start            线程准备就绪,等待CPU调度

  • setName      为线程设置名称

  • getName      获取线程名称

  • setDaemon   设置为后台线程或前台线程(默认)
                       如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
                        如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止

  • join               逐个执行每个线程,执行完毕后继续往下执行...

  • run              线程被cpu调度后执行此方法

2、线程锁

由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,CPU接着执行其他线程。所以,可能出现如下问题:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time

gl_num = 0

def show(arg):
    global gl_num
    time.sleep(1)
    gl_num +=1
    print gl_num

for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print 'main thread stop'

未使用线程锁
#!/usr/bin/env python
#coding:utf-8
  
import threading
import time
  
gl_num = 0
  
lock = threading.RLock()
  
def Func():
    lock.acquire()
    global gl_num
    gl_num +=1
    time.sleep(1)
    print gl_num
    lock.release()
      
for i in range(10):
    t = threading.Thread(target=Func)
    t.start()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章