1.同步
#引用时间片段,系统
import time
import os
#同步进程阻塞
def rep_a():
print("开始请求处理rep_a");
time.sleep(5)
print("完成处理rep_a");
def rep_b():
print("开始请求处理rep_b");
print("完成请求处理rep_b");
#主函数调用a,b函数,先调用a
def main():
rep_a();
rep_b();
if __name__ == "__main__":
main()
运行时候只有a运行完之后才能运行b,在这里使a休眠五秒种时候,b函数只有等待
运行结果:
2.函数的异步,在这里我们要引用线程,注意Python2 和Python3 引用方式不一样,python2通过import thread引用,而Python3则需要from threading import Thread,对于异步的理解,对于耗时的过程,我们将其交给别人(如其另外一个线程)去执行,而我们继续往下处理,当别人执行完耗时操作后再将结果反馈给我们,这就是我们所说的异步。
import time
from threading import Thread
def long_io(callback):
def fun(cb):
print("开始执行IO操作...");
time.sleep(5);
print("完成IO操作,并执行回调函数...")
#执行回调函数
cb("io result")
#开区线程执行耗时操作
t=Thread(target=fun,args=(callback,))
t.start()
def on_finish(ret):
print("开始执行回调函数on_finish")
# ret=yield long_io()
print("ret: %s "% ret);
print("完成执行回调函数on_finish")
def rep_a():
print("开始处理请求rep_a");
#调用long_io函数
long_io(on_finish);
print("离开处理请求rep_a");
def rep_b():
print("开始处理请求rep_b")
time.sleep(2);
print("完成处理请求rep_b")
def main():
rep_a();
rep_b();
#在这里加了一个while使函数进入一个死循环,防止程序运行停止
while 1:
pass;
if __name__ == "__main__":
main()
运行结果如下:
3.函数的协程,在使用回调函数写异步程序时,需将本属于一个执行逻辑(处理请求a)的代码拆分成两个函数req_a和on_finish,这与同步程序的写法相差很大。
import time
from threading import Thread
#全局生成器,供long_io使用
gen = None;
def long_io():
def fun():
print("开始执行IO操作");
global gen;
time.sleep(5);
try:
print("完成IO操作,并sent结果唤醒挂起程序继续执行")
gen.send("io result")
except Exception as e:
pass;
t=Thread(target=fun,args=());
t.start();
def req_a():
print("开始处理请求rep_a");
ret = yield long_io();
print("ret: %s "%ret);
print("完成处理请求rep_a");
def req_b():
print("开始请求处理req_b");
time.sleep(2);
print("完成处理rep_b");
def main():
global gen;
gen=req_a();
next(gen);
req_b();
#如果不想一直循环可以把while注掉
# while 1:
# pass
if __name__ == "__main__":
main()
运行结果如下