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)
    转载请注明出处!谢谢!
  • 相关阅读:
    今日确定开源近两年来的EA程序
    升级了NinjaLoveFish Excel量化表格
    到家第一件事就是脱衣服
    对挑选完成的股票,进行批量建仓
    lua 学习之错误处理
    lua 学习之编译
    Lambda 演算入门
    lua学习之深入函数第二篇
    lua学习之深入函数第一篇
    lua学习之复习汇总篇
  • 原文地址:https://www.cnblogs.com/felix-g/p/11348859.html
Copyright © 2011-2022 走看看