人生苦短之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多线程的主要内容,如果未能解决你的问题,请参考以下文章

人生苦短之Python发邮件

人生苦短之Python迭代器

人生苦短之Python列表拷贝

人生苦短之Python类的一二三

人生苦短之Python文件的IO操作

人生苦短之Python枚举类型enum