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)
    转载请注明出处!谢谢!
  • 相关阅读:
    web框架开发-Django模型层(1)之ORM简介和单表操作
    web框架开发-模板层
    生产者-消费者模式
    不变模式
    SynchronousQueue
    ThreadLocal
    锁的优化以及Java虚拟机对锁优化所做的努力
    随机数据结构:跳表(SkipList)
    数据共享通道:BlockingQueue
    CopyOnWriteArrayList
  • 原文地址:https://www.cnblogs.com/felix-g/p/11348859.html
Copyright © 2011-2022 走看看