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

    参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017629247922688

    多任务可以由多进程完成,也可以由一个进程内的多线程完成。

    进程是由若干线程组成的,一个进程至少有一个线程。

    threading

    import time
    import threading
    
    
    # 新线程执行的代码
    def loop(n: int):
        print(f'线程{threading.current_thread().name} 正在运行...')
        while n < 5:
            n = n + 1
            print(f'线程{threading.current_thread().name}>>>{n}')
            time.sleep(1)
        print(f'线程{threading.current_thread().name} 结束。')
    
    
    # current_thread() 返回当前线程的实例
    print(f'主线程{threading.current_thread().name}正在运行')
    
    # target=线程需执行的方法, name=线程的名字(线程的名字仅用于打印显示), args=(执行函数的参数,)
    t = threading.Thread(target=loop, name='LoopThread', args=(0, ))
    t.start()
    t.join()
    
    # 任何进程都会默认启动一个线程,这里启动的就是 MainThread , 主线程中可以启动新的线程
    print(f'主线程{threading.current_thread().name}结束')
    

    运行结果:

    /Users/zy7y/PycharmProjects/demo/venv/bin/python /Users/zy7y/PycharmProjects/demo/threading_demo.py
    主线程MainThread正在运行
    线程LoopThread 正在运行...
    线程LoopThread>>>1
    线程LoopThread>>>2
    线程LoopThread>>>3
    线程LoopThread>>>4
    线程LoopThread>>>5
    线程LoopThread 结束。
    主线程MainThread结束
    
    Process finished with exit code 0
    

    Lock

    多进程中,同一个变量,在每一个进程中,互不影响。

    多线程中,所有变量都由所有线程共享,即任何一个变量都可以被任何一个线程修改线程之间共享数据最大的危险在于多个线程同时改一个变量

    import time
    import threading
    
    # 银行存款
    balance = 0
    
    # 锁实例
    lock = threading.Lock()
    
    
    def change_it(n: int):
        # 先存后取,结果应该为0
        # global 全局(共享)变量:
        global balance
        balance = balance + n
        balance = balance - n
    
    
    def run_thread(n: int):
        for i in range(1000000):
            # 获取锁
            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)
    
    
    
    作者:zy7y
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    delphi shr和shl的作用
    delphi socket 编程 使用多线程
    mysql 移除服务,并在cmd下切换目录
    delphi 结构体和TList的用法
    delphi 使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行。
    Unicode 和 UTF-8 的区别
    Python 模块 re (Regular Expression)
    Python的函数式编程
    反向解析与PTR(Pointer Record)
    simhash算法
  • 原文地址:https://www.cnblogs.com/zy7y/p/13340813.html
Copyright © 2011-2022 走看看