python学习 同步/异步

【什么是同步】
同步就是协同步调,按预定的先后次序进⾏运⾏。如:你说完,我再说。
"同"字从字⾯上容易理解为⼀起动作。其实不是,"同"字应是指协同、协助、互相配合。
如进程、线程同步,可理解为进程或线程A和B⼀块配合,A执⾏到⼀定程度时要依靠B的某个结果,于是停下来,示意B运⾏;B依⾔执⾏,再将结果给 A;A再继续操作。

【什么是异步】
异步是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态、通知、回调来通知调用者处理结果。

即我们可以理解为:我打电话的时候只允许和一个人通信,和这个人通信结束之后才允许和另一个人开始。这就是同步。
         我们发短信的时候发完可以不去等待,去处理其他事情,当他回复之后我们再去处理,这样就大大解放了我们的时间。这就是异步。

 

#########同步的使用---多个程序有序执行#########
from threading import Thread,Lock
from time import sleep

class Task1(Thread):
    def run(self):
        while True:
            if lock1.acquire():
                print('task1')
                sleep(0.5)
                lock2.release()

class Task2(Thread):
    def run(self):
        while True:
            if lock2.acquire():
                print('task2')
                sleep(0.5)
                lock3.release()

class Task3(Thread):
    def run(self):
        while True:
            if lock3.acquire():
                print('task3')
                sleep(0.5)
                lock1.release()

#使用Lock创建出的锁默认没有锁上
lock1=Lock()
#创建另外一把锁,并且锁上(主线程锁的,只有先解锁了才可继续上锁)
lock2=Lock()
lock2.acquire()
#创建另外一把锁,并且锁上(主线程锁的,只有先解锁了才可继续上锁)
lock3=Lock()
lock3.acquire()

t1=Task1()
t2=Task2()
t3=Task3()

t1.start()
t2.start()
t3.start()

#打印结果
# task1
# task2
# task3
# task1
# task2
# task3
# ...


#########异步的实现#########
from multiprocessing import Pool
from time import sleep
import os

def work():
    print('---进程池中的进程-pid={},ppid={}'.format(os.getpid(),os.getppid()))
    for i in range(3):
        print('----{}----'.format(i))
        sleep(1)
    return 'haha'

def work1(args):
    print('callback func pid={}'.format(os.getpid()))
    print('callback func arg={}'.format(args))

if __name__ == '__main__':
    pool=Pool(3)
    pool.apply_async(func=work,callback=work1)  

    #主进程没停,当work1回调了work执行的结果之后,执行work1,然后再继续执行主进程
    while True:
        sleep(1)
        print('主进程pid={}'.format(os.getpid()))

#打印结果
# ---进程池中的进程 - pid = 9268, ppid = 20776
# ----0 - ---
# 主进程pid = 20776
# ----1 - ---
# 主进程pid = 20776
# ----2 - ---
# 主进程pid = 20776
# callback func pid = 20776
# callbacf unc arg = haha
# 主进程pid = 20776
# 主进程pid = 20776
# 主进程pid = 20776
# ...

 

posted on 2019-08-21 23:23  cherry_ning  阅读(341)  评论(0)    收藏  举报

导航