zoukankan      html  css  js  c++  java
  • python 多线程

    Python模块:threading

    目录 00x1 多线程基础讲解
     00x2 简单多线程案例
     00x3 锁的概念
     00x4 习题作业

     00x1 多线程基础讲解_↑↑↑↑↑↑↑↑↑↑↑↑↑

    要使用多线程的函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行。

    t = threading.Thread(target=worker)   #将worker函数实例化为Thread对象
    t.start()    #实例化以后需要开始这个线程

    由于python的多线程是伪多线程(并非真正意义的多线程)所以其线程并发出来的结果呈无规律状态。比如如下代码:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    #by def
    
    import threading
    
    def qwe():
        print 1
    
    a = threading.Thread(target=qwe)
    b = threading.Thread(target=qwe)
        
    a.start()
    b.start()
    print 'def'
    View Code

    按照我惯例最后print的应该是最后输出才对,但实际运行了并非如此

    执行结果:

    之所以说python的多线程是伪的多线程就是因为如此。真正的多线程好比花了好几个人同时去工作直至把他做完。而python只是一个人只做一点就丢给另外一个人。每个人做一点,所以在很多时候就会导致线程还没有执行完毕就执行线程以外的东西。这里就引进了一个join。相当于一个线程的分界线,告诉Thread给你的任务先做完了你才能执行下面的代码。不然就打死你。

    如此代码:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    #by def
    
    import threading
    
    def qwe():
        print 1
    
    a = threading.Thread(target=qwe)
    b = threading.Thread(target=qwe) //两个线程
        
    a.start()
    b.start()
    a.join()   #加上join了以后就不会逾越这个分界线了
    b.join()
    print 'def'
    执行结果:

     但当线程有参数的时候呢?


     

    00x2 简单案例_↑↑↑↑↑↑↑↑↑↑↑↑↑

     1 #!/usr/bin/python
     2 # -*- coding: UTF-8 -*-
     3 #by def
     4 
     5 import threading
     6 import time
     7 def a():
     8     time.sleep(2)
     9     print 'A Start'
    10     time.sleep(2)
    11     print 'A End'
    12 def b():
    13     time.sleep(2)
    14     print 'B Start'
    15     time.sleep(2)
    16     print 'B End'
    17 time1 = time.time()
    18 a()
    19 b()
    20 print time.time()-time1
    没使用多线程案例 即为图一
     1 #!/usr/bin/python
     2 # -*- coding: UTF-8 -*-
     3 #by def
     4 
     5 import threading
     6 import time
     7 def a():
     8     time.sleep(2)
     9     print 'A Start'
    10     time.sleep(2)
    11     print 'A End'
    12 def b():
    13     time.sleep(2)
    14     print 'B Start'
    15     time.sleep(2)
    16     print 'B End'
    17 time1 = time.time()
    18 q = threading.Thread(target=a)
    19 w = threading.Thread(target=b)
    20 q.start()
    21 w.start()
    22 q.join()
    23 w.join()
    24 print time.time()-time1
    使用多线程案例 即为图二

    可见一个用了八秒一个用了四秒。


     

     00x3 锁的概念_↑↑↑↑↑↑↑↑↑↑↑↑↑

      00x2的简单案例重的图重可以看出图二(使用了多线程)的输出是有问题的。再次证明了其伪多线程特征。那么他既然是一个人干一下活就丢给别人干,我们就让其干完了再干下一个活。这里就涉及到一个锁的概念。先关到小黑屋先干好了。然后再打开门。换另外一个小黑屋继续干。切记,【进屋子要关锁,出来的时候要开锁(言下之意就是在你要执行的代码执行之前关锁,执行完了要把锁关上)

      该种锁称之为“互斥锁”即LOCK,上锁:acquire 开锁:release

    案例:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    #by def
    
    import threading
    import time
    
    mlock = threading.Lock()
    
    def a():
        mlock.acquire() #加上
        time.sleep(2)
        print 'A Start'
        time.sleep(2)
        print 'A End'
        mlock.release() #开锁
    
    q = threading.Thread(target=a)
    q.start()

    00x4 习题作业_↑↑↑↑↑↑↑↑↑↑↑↑↑

    题目:有10个刷卡机,代表建立10个线程,每个刷卡机每次扣除用户一块钱进入总账中,每个刷卡机每天一共被刷100次。账户原有500块。所以当天最后的总账应该为1500

    答案:

    #encoding=utf-8
    #by def
    
    import threading
    mLock = threading.Lock()
    
    money = 500
    
    def a():
        global money
        for i in xrange(100):
            mLock.acquire()
            money += 1
            mLock.release()
    
    l = []
    for i in xrange(10):
        t = threading.Thread(target=a)
        t.start()
        l.append(t)
    
    for i in l:
        t.join()
    
    
    print money
  • 相关阅读:
    《计算机网络 自顶向下方法》整理(二)应用层
    《计算机网络 自顶向下方法》整理(一)计算机网络和因特网
    《深入理解C#》整理10-使用async/await进行异步编程
    STM32 HAL库之串口详细篇
    .Net微服务实战之负载均衡(下)
    面试官:来,年轻人!请手撸5种常见限流算法!
    工具用的好,下班回家早!iTerm2使用技巧指北!
    Java编程规范(命名规则)
    Go语言快速安装手册
    Educational Codeforces Round 6 620E. New Year Tree(DFS序+线段树)
  • 原文地址:https://www.cnblogs.com/xishaonian/p/7624736.html
Copyright © 2011-2022 走看看