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)
    转载请注明出处!谢谢!
  • 相关阅读:
    django第二个项目使用模板做一个站点访问计数器
    python 从ftp下载数据
    django第一个项目HelloWord
    数据挖掘之KNN分类
    java的函数参数传递
    将数组按照奇偶顺序排列
    win7 64位下安装nltk的问题
    [转]安装androidADT插件长时间停留在calculating requirements and dependencies
    排序算法之插入排序
    非等值折半查找
  • 原文地址:https://www.cnblogs.com/felix-g/p/11348859.html
Copyright © 2011-2022 走看看