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)
    转载请注明出处!谢谢!
  • 相关阅读:
    私活。
    sql server 模拟数组【转】
    Updlock 与 Holdlock
    连上交换机后电脑无法上网
    linux的发展
    MySQL5.7中,用root用户登陆不进去数据库,报以下错误,然后重新修改了密码,好了。
    nginx反响代理tomcat配置ssl
    tomcat日志的切割脚本
    重启nginx报错:[error] invalid PID number "" in "/application/nginx-1.13.3/logs/nginx.pid"
    数据盘的挂载
  • 原文地址:https://www.cnblogs.com/felix-g/p/11348859.html
Copyright © 2011-2022 走看看