zoukankan      html  css  js  c++  java
  • python编程中的并发------多线程threading模块

    任务例子:喝水、吃饭动作需要耗时1S

    单任务:(耗时20s)

    for i in range(10):

        print('a正在喝水')

        time.sleep(1)

        print('a正在吃饭')

        time.sleep(1)

    一、多线程(耗时10s)

    threading模块开启2个线程实现

    代码如下:

    def start(fuc):
    for i in range(10):
    print('正在{}'.format(fuc))
    time.sleep(1)

    # 定义一个子线程,调用start函数,给定的参数为'喝水'
    t1 = threading.Thread(target=start,args = ('喝水',))
    # 定义一个子线程,调用start函数,给定的参数为'吃饭'
    t2 = threading.Thread(target=start,args = ('吃饭',))
    # 开启t1这个子线程
    t1.start()
    # 开启t1这个子线程
    t2.start()

    二、多线程问题:共享资源竞争(调用同一个file,或者同一个全局变量导致的问题)

    使用全局的互斥锁

    例:2个线程都需要使用全局变量a,任务为给a累加到200000

    # 定义一个互斥锁
    lock = threading.Lock()
    a=0

    def add():
    global a
    for i in range(100000):
    # 上锁
    lock.acquire()
    a += 1
    # 解锁
    lock.release()

    # 定义一个子线程
    t1 = threading.Thread(target=add)
    # 定义一个子线程
    t2 = threading.Thread(target=add)
    # 开启t1这个子线程
    t1.start()
    # 开启t1这个子线程
    t2.start()
    while True:
    print(a)

    lock的第二种写法

    # 定义一个互斥锁
    lock = threading.Lock()
    a=0

    def add():
    global a
    for i in range(100000):
    with lock:
    a += 1


    # 定义一个子线程
    t1 = threading.Thread(target=add)
    # 定义一个子线程
    t2 = threading.Thread(target=add)
    # 开启t1这个子线程
    t1.start()
    # 开启t1这个子线程
    t2.start()
    while True:
    print(a)
    转载请注明出处!谢谢!
  • 相关阅读:
    2019.9.18 csp-s模拟测试46 反思总结
    2019.9.17 csp-s模拟测试45 反思总结
    矩阵求导(包含极大似然估计)
    sir
    Square into Squares. Protect trees!(平方数分解平方和)
    最小二乘法
    2.5&2.6 numpy&pandas 笔记
    2.4 python学习笔记
    2.3 python学习笔记
    2.1&2.2python学习笔记
  • 原文地址:https://www.cnblogs.com/felix-g/p/11348859.html
Copyright © 2011-2022 走看看