python中通过多线程解决多任务

# 多线程执行多任务
import threading
import time


def Sing():
    for i in range(5):
        print('唱歌-----%d' % i)
        time.sleep(1)


def Dance():
    for i in range(5):
        print('跳舞-------%d' % i)
        time.sleep(1)


if __name__ == '__main__':
    s = threading.Thread(target=Sing)
    d = threading.Thread(target=Dance)
    # 开启线程
    s.start()
    d.start()

结果为:

 

 

多线程共享全局变量

# 多线程共享全局变量
import threading
import time

num = 100


def test1():
    global num
    for i in range(100000):
        num += 1
    print('test1-----', num)


def test2():
    global num
    for i in range(100000):
        num += 1
    print('test2---', num)


if __name__ == '__main__':
    t1 = threading.Thread(target=test1)
    t2 = threading.Thread(target=test2)

    t1.start()
    t2.start()

    while len(threading.enumerate()) != 1:
        time.sleep(1)

    print("2个线程对同一个全局变量操作之后的最终结果是:%s" % num)

结果为:

 

 结论

如果多个线程共享一个全局变量,则会造成资源竞争的情况,从而数据会不正确

 

互斥锁

互斥锁能够很好的解决资源竞争的问题

# 多线程共享全局变量
import threading
import time

num = 0


def test1():
    global num
    for i in range(1000000):
        mutex.acquire()  # 上锁
        num += 1
        mutex.release()  # 解锁
    print('test1-----', num)


def test2():
    global num
    for i in range(1000000):
        mutex.acquire()  # 上锁
        num += 1
        mutex.release()  # 解锁
    print('test2---', num)


if __name__ == '__main__':
    # 创建一个互斥锁
    # 默认是未上锁的状态
    mutex = threading.Lock()

    t1 = threading.Thread(target=test1)
    t2 = threading.Thread(target=test2)

    t1.start()
    t2.start()

    while len(threading.enumerate()) != 1:
        time.sleep(1)

    print("2个线程对同一个全局变量操作之后的最终结果是:%s" % num)

结果为:

 

posted @ 2020-05-07 21:39  ybw~  阅读(560)  评论(0)    收藏  举报