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

    https://www.cnblogs.com/wj-1314/p/8263328.html

    threading 模块

    先上代码:

     1 import time, threading
     2 
     3 def loop():
     4     print("thread %s is running..." %threading.current_thread().name)
     5     n = 0
     6     while n<5:
     7         n += 1
     8         print('thread %s >>> %s'%(threading.current_thread().name, n))
     9         time.sleep(1)
    10     print("thread %s ended." %threading.current_thread().name)
    11 
    12 def loop1():
    13     x = 1
    14     while x <3:
    15         print(x,"loop1的线程")
    16         x += 1
    17         time.sleep(2)
    18 
    19 if __name__ == "__main__":
    20     print("thread %s is running ..." %threading.current_thread().name)
    21     t = threading.Thread(target = loop, name = "LoopThread")
    22     t1 = threading.Thread(target = loop1)
    23     t.start()
    24     t1.start()
    25     t.join()
    26     t1.join()
    27     print("thread %s ended." % threading.current_thread().name)
    28     
    29 
    30 """
    31 thread MainThread is running ...
    32 thread LoopThread is running...1
    33 thread LoopThread >>> 1
    34 loop1的线程
    35 thread LoopThread >>> 2
    36 2thread LoopThread >>> 3 
    37 loop1的线程
    38 thread LoopThread >>> 4
    39 thread LoopThread >>> 5
    40 thread LoopThread ended.
    41 thread MainThread ended.
    42  
    43 """
    View Code

    由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个threading.current_thread() 获取当前线程的实例。

    但是有些情况下,多线程会产生场景上的错误,比如

    import time, threading
    
    # 假定这是你的银行存款:
    balance = 0
    
    def change_it(n):
        # 先存后取,结果应该为0:
        global balance
        balance = balance + n
        balance = balance - n
    
    def run_thread(n):
        for i in range(100000):
            change_it(n)
    
    t1 = threading.Thread(target=run_thread, args=(5,))
    t2 = threading.Thread(target=run_thread, args=(8,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(balance)

    结果有时会报错

    如果我们要确保balance计算正确,就要给change_it()上一把锁,当某个线程开始执行change_it()时,我们说,该线程因为获得了锁,因此其他线程不能同时执行change_it(),只能等待,直到锁被释放后,获得该锁以后才能改。由于锁只有一个,无论多少线程,同一时刻最多只有一个线程持有该锁,所以,不会造成修改的冲突。创建一个锁就是通过threading.Lock()来实现:

    import time, threading
    lock = threading.Lock()
    
    # 假定这是你的银行存款:
    balance = 0
    
    def change_it(n):
        # 先存后取,结果应该为0:
        global balance
        balance = balance + n
        balance = balance - n
    
    def run_thread(n):
        for i in range(100000):
    
            lock.acquire()
            try:
                change_it(n)
            finally:
                lock.release()
                
    
    t1 = threading.Thread(target=run_thread, args=(5,))
    t2 = threading.Thread(target=run_thread, args=(8,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(balance)
  • 相关阅读:
    软件工程概论作业二 电梯调度思路 信1205班 刘权毅 董文轩
    软件工程概论作业一 信1205班 20122561 董文轩
    团队开发第三天(董文轩,苏康奖,常晓杨,刘权毅,刘梦辉,刘若凡)
    软件工程概论作业三 信1205班 董文轩 刘权毅
    IDEA 搭建spring+maven+mybatis+mysql+junit+log4j2
    什么时候需要实现序列化Serializable
    IDEA如何查看maven依赖冲突
    Docker for windows : 安装linux
    Mybatis 分页
    POI java操作OFFICE产品
  • 原文地址:https://www.cnblogs.com/botoo/p/9011028.html
Copyright © 2011-2022 走看看