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

    并发:任务数多于CPU核数时
    并行:任务数小于CPU核数时

    线程:
    使用threading模块使用线程
    import threading
    线程名 = threading.Thread(target = 函数名)
    线程名.start()

    主线程会等待所有子线程结束后才结束

    如果需求时让主线程不等待某个子线程结束就立即结束,
    解决方法是主线程守护
    线程名.setDaemon(True)
    例:

    import threading, time
    
    def work(num):
    for i in range(num):
    print("work...")
    time.sleep(0.1)
    
    if __name__ == '__main__':
    work_thread = threading.Thread(target=work, args=(10,))
    # 需求:不管子线程的任务是否执行完成 只有主线程的任务执行完程序就结束
    # 解决方案:子线程名.setDaemon(True)
    work_thread.setDaemon(True)
    work_thread.start()
    print("测试")

    线程传参的两种方法:
    1.args
    线程名 = threading.Thread(target = 函数名, args =(变量1,变量2...))
    2.kwargs
    线程名 = threading.Thread(target = 函数名, kwargs = {"变量名1":实参1,"变量名2":实参2})

    查看当前线程
    threading.current_thead()
    查看运行的线程列表
    threading.enumerate()
    查看程序中有几个线程在工作
    1. len(threading.enumerate())
    2. threading.active_count()

    多线程全局变量问题点:资源争夺问题

    import threading
    num = 0
    def work1(a):
    global num
    for i in range(1000000):
    num += 1
    print("work1:", num)
    
    def work2(a):
    global num
    for i in range(1000000):
    num += 1
    print("work2:", num)
    
    if __name__ == '__main__':
    work1_thread = threading.Thread(target=work1)
    work2_thread = threading.Thread(target=work2)
    work1_thread.start()
    work2_thread.start()


    结果:
    work2: 1193318
    work1: 1230812

    原因:work1大于1000000是因为累加时work2也会进行累加
    work2小于2000000是因为在累加时work1和work2有可能返回同一个值

    解决方案:线程同步
    先执行的线程名.join()
    代码:

    import threading
    num = 0
    def work1():
    global num
    for i in range(1000000):
    num += 1
    print("work1:", num)
    
    def work2():
    global num
    for i in range(1000000):
    num += 1
    print("work2:", num)
    
    if __name__ == '__main__':
    work1_thread = threading.Thread(target=work1)
    work2_thread = threading.Thread(target=work2)
    work1_thread.start()
    work1_thread.join()
    work2_thread.start()

    自定义线程:
    线程默认只能执行一个任务,自定义线程就是将多个函数用一个函数调用,线程只完成这一个函数就完成了多个任务。

  • 相关阅读:
    源码分析:Java对象的内存分配
    源码分析:Java堆的创建
    Java Main如何被执行?
    HotSpot模板解释器目标代码生成过程源码分析
    Java常量池解析与字符串intern简介
    Java类的连接与初始化 (及2013阿里初始化笔试题解析)
    css中对position的几种定位方式的最佳诠释
    DB2学习笔记
    three.js:Failed to execute 'texImage2D' on 'WebGLRenderingContext解决方案
    线程隔离ThreadLocal
  • 原文地址:https://www.cnblogs.com/zc2018/p/8834980.html
Copyright © 2011-2022 走看看