近期学到了python的同步和异步处理,跟大家分享一下,希望能够带大家理解一下同步和异步。下面我举一个例子:

同步

import time


def work1():
    for i in range(5):
        time.sleep(1)
        print("work1-打孔--{}".format(i))


def work2():
    for i in range(6):
        time.sleep(1)
        print("work2--浇花-{}".format(i))


if __name__ == '__main__':
    s_t = time.time()
    work1()
    work2()
    e_t = time.time()
    print(e_t - s_t)



执行结果:
work1-打孔--0
work1-打孔--1
work1-打孔--2
work1-打孔--3
work1-打孔--4
work2--浇花-0
work2--浇花-1
work2--浇花-2
work2--浇花-3
work2--浇花-4
work2--浇花-5
11.00449013710022

这里执行了work1() 和 work2(),还有从开始执行到结束执行共计用了多长时间。执行结果我贴在了上面。从执行结果看:可以看出来1点:
1、先执行完work1(),work1()执行完毕后才会去执行work2()函数,最后执行结束之后计算了总共花了11.00449013710022秒。

异步

import time
from threading import Thread


def work1():
    for i in range(5):
        time.sleep(1)
        print("work1-打孔--{}".format(i))


def work2():
    for i in range(6):
        time.sleep(1)
        print("work2--浇花-{}".format(i))


def work3():
    for i in range(6):
        time.sleep(1)
        print("work3--写代码-{}".format(i))


if __name__ == '__main__':
    s_t = time.time()
    # 创建一个线程
    t1 = Thread(target=work1)
    t1.start()
    # 创建一个线程:
    t2 = Thread(target=work2)
    t2.start()
    # 创建一个线程:
    t3 = Thread(target=work3)
    t3.start()

   
    e_t = time.time()
    print(e_t - s_t)




执行结果:
0.0003390312194824219
work1-打孔--0
work2--浇花-0
work3--写代码-0
work1-打孔--1work2--浇花-1

work3--写代码-1
work1-打孔--2
work3--写代码-2work2--浇花-2

work1-打孔--3
work2--浇花-3
work3--写代码-3
work1-打孔--4work2--浇花-4work3--写代码-4


work3--写代码-5
work2--浇花-5

这个时候你会发现:
1、3个函数同时在跑。

2、他直接打印了时长,其他线程还在跑。是因为主线程不会等待子线程跑完然后再去执行。

大家可以理解为 打孔、浇花、写代码我都得同时进行,那我一个人忙不过来咋办呢?我这个时候就喊了2个小伙伴(添加了2个子线程),那这个时候我们就能一起干活了!进而任务完全完成发现才6秒几(看下图)

下面我们就得想怎么让线程跑完后再去执行计算时长这个代码。

import time
from threading import Thread


def work1():
    for i in range(5):
        time.sleep(1)
        print("work1-打孔--{}".format(i))


def work2():
    for i in range(6):
        time.sleep(1)
        print("work2--浇花-{}".format(i))


def work3():
    for i in range(6):
        time.sleep(1)
        print("work3--写代码-{}".format(i))


if __name__ == '__main__':
    s_t = time.time()
    # 创建一个线程
    t1 = Thread(target=work1)
    t1.start()
    # 创建一个线程:
    t2 = Thread(target=work2)
    t2.start()
    # 创建一个线程:
    t3 = Thread(target=work3)
    t3.start()

    主线程等待子线程执行
    t1.join()
    t2.join()
    t3.join()
    e_t = time.time()
    print(e_t - s_t)




打印结果:
work2--浇花-0work1-打孔--0

work3--写代码-0
work2--浇花-1
work1-打孔--1
work3--写代码-1
work2--浇花-2
work1-打孔--2
work3--写代码-2
work1-打孔--3work2--浇花-3

work3--写代码-3
work2--浇花-4
work1-打孔--4
work3--写代码-4
work2--浇花-5
work3--写代码-5
6.004496335983276

不难发现,我在后面添加了t1.join(),t2.join(),t3.join(),这就是我设置了等待该子线程执行结束后再执行下面的代码。大家理解了吗。

Thread(target=指定线程执行的任务函数):创建线程

Thread.start() :启动线程

注意点:默认的情况下主线程时不会等待子线程执行的

Thread.join():设置主线程等待子线程执行的时间
 join不传参数默认等待改子线程执行结束,可以通过参数设置指定的等待时间