认识函数的同步、异步、协程

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()

运行结果如下
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值