zoukankan      html  css  js  c++  java
  • 人生苦短之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 
    " % 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()
    
  • 相关阅读:
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第八章FPGA片内FIFO读写测试实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第七章 FPGA片内ROM测试实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第六章 FPGA片内RAM读写测试实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第五章 Vivado下PLL实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第四章 PL的LED实验
    在Mac OS X中使用VIM开发STM32(3)
    在Mac OS X中使用VIM开发STM32(2)
    STM32F40xxx 与 STM32F41xxx Flash结构详解
    在Mac OS X中搭建STM32开发环境(3)
    在Mac OS X中搭建STM32开发环境(2)
  • 原文地址:https://www.cnblogs.com/dreamyu/p/7592502.html
Copyright © 2011-2022 走看看