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()

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

  • 相关阅读:
    Oracle Autonomous Health Framework(AHF)
    Autonomous Health Framework(AHF)相关操作
    Postgresql 正则表达式
    如何去官网下载JDK (JDK8 JDK1.8)
    配置免安装版Oracle客户端
    子用户角色权限菜单 浅谈:子账户设计方案
    EF Power Tools Beta 2 生成 Entity Framework Code First 提示 参数错误 hresult e_invalidarg
    mvc 截取上传图片做头像,自动生成不同小尺寸缩略图
    亚马逊的下拉菜单插件 jQueryMenuAim 使用
    apacheab并发负载压力测试
  • 原文地址:https://www.cnblogs.com/zc2018/p/8834980.html
Copyright © 2011-2022 走看看