人生苦短之Python多线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人生苦短之Python多线程相关的知识,希望对你有一定的参考价值。
#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()
以上是关于人生苦短之Python多线程的主要内容,如果未能解决你的问题,请参考以下文章