#encoding=utf-8
import threading
import time
'''
python多线程并不是真正意义上的多线程,通常我们所说的多线程是多个线程同时执行某功能,而在python中
则是同一时间只有一个获得GIL的线程在跑,也就是GIL的存在使得python并不是真正意义上的多线程,特别是
在处理CPU密集型程序,但是在处理IO密集型程序时python多线程还是能发挥多线程的优势的,这是因为IO速
度相对于CPU来是很慢的(例如网络传输等)。GIL(global interpreter lock)全局解释锁,在执行python
代码时会产生互斥锁来限制线程对共享资源的访问。
开启线程的两种方式:
1.threading.Thread() Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数。
2.继承thread.Thread类,并重写run方法
'''
def action(arg):
time.sleep(3)
print 'the arg is %s' % arg
num_list = [1, 2, 3, 4]
# for i in num_list:
# t = threading.Thread(target=action, args=(i, ))
# t.start()
# class MyThread(threading.Thread):
# def __init__(self, arg):
# super(MyThread, self).__init__()
# self.arg = arg
#
# def run(self):
# time.sleep(1)
# print "the arg is %s \n" % self.arg
# print self.name
#
# for i in num_list:
# t = MyThread(i)
# t.start()
'''
构造方法:
Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数。
实例方法:
isAlive(): 返回线程是否在运行。正在运行指启动后、终止前。
get/setName(name): 获取/设置线程名。
start(): 线程准备就绪,等待CPU调度
is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(守护线程在start之前设置)
如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
start(): 启动线程。
join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。
'''
'''
线程锁,避免多个线程对共享资源的同时操作产生错误,在线程中使用Rlock
'''
# 创建一个锁
lock = threading.RLock()
gl_num = 100
def action_unlock():
# 定义一个全局变量
global gl_num
while gl_num > 0:
gl_num -= 1
time.sleep(1)
print 'the arg is %d' % gl_num
print threading.current_thread().name
print ''
def action_lock():
global gl_num
while gl_num > 0:
# 锁定
lock.acquire()
gl_num -= 1
# time.sleep(1)
print 'the arg is %d' % gl_num
print threading.current_thread().name
# 完成操作锁释放
lock.release()
thread_list = []
# 开启五个线程
for i in xrange(5):
t = threading.Thread(target=action_unlock)
thread_list.append(t)
for t in thread_list:
# 线程启动
t.start()