python实现异步调用函数执行

在实现异步调用之前我们先进行什么是同步调用和异步调用

  • 同步:是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行
  • 异步:是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态、通知、回调来通知调用者处理结果

分析一下,下面的例子: 
定义了一个装饰器 async 和 A 、B 两个function 函数
A 里面sleep 10s , 然后打印 a function 字符串 
B 里面直接打印 b function 字符串 
我们顺序调用两个功能: 
A() 
B( )

由于函数A在睡的状态,我们又不希望程序被阻塞在函数A的睡的状态,所以我们采用异步执行,即在函数A睡的状态,让其他的任务执行

from threading import Thread
from time import sleep

def async(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target=f, args=args, kwargs=kwargs)
        thr.start()

    return wrapper

@async
def A():
    sleep(10)
    print("函数A睡了十秒钟。。。。。。")
    print("a function")

def B():
    print("b function")

A()
B()

执行结果:

#b function
#函数A睡了十秒钟。。。。。。
#a function

原文地址:https://www.cnblogs.com/sui776265233/p/10950001.html

时间: 2024-10-28 05:32:57

python实现异步调用函数执行的相关文章

python学习日常-调用函数&定义函数

这几天由于生病,所以停了下. 调用函数相当的简单,比其他许多语言简单多了.我们知道,python中有许多自带的方法,我们要用的时候,就直接“方法名(参数);"就可以调用了.比如调用类型转换方法将一个int类型转换为str类型就可以str(123):就好了 定义函数,一个函数简单的定义就是 关键字(def) 方法名(参数): 做什么: 比如定义一个a+b的方法 def Add(a,b): return a+b; 忘了说明,python函数一定有返回值,即return,你可以返回为none,但是还是

python获得线程调用函数的返回值

threading.Thread 并没有显式的提供获取线程调用函数返回值的方法,需求自己实现. 使用数据库是一个办法: 可以让子线程将数据写到数据库中,消费线程再去数据库中读取数据: 如果不想用数据库,可以使用类的全局变量来做传递, 示例代码如下: import os import threading class SubThread(): data = {} def __init__(self): ... def execute_func(self, key): # 执行各种操作 ... ret

python可变参数调用函数问题

一直使用python实现一些想法,最近在使用python的过程中出现这样一个需求,定义了一个函数,第一个是普通参数,第二个是默认参数,后面还有可变参数,在最初学习python的时候,都知道非关键字可变参数和关键字可变参数两种,调用的方式也非常多种多样,这里主要提出一个比较隐含的问题,并将各种可能出现的情况进行了探讨. 函数声明格式 python虽然不支持函数重载,但是通过对函数参数的众多特性的支持基本弥补了.函数声明的通式如下: def func(argv1,argv2...[,argv_d =

python 获取当前调用函数名等log信息

import sys funcName = sys._getframe().f_back.f_code.co_name #获取调用函数名 lineNumber = sys._getframe().f_back.f_lineno #获取行号 print sys._getframe().f_code.co_name # 获取当前函数名 import inspect def get_current_function_name(): return inspect.stack()[1][3] class

Delphi Firemonkey在主线程 异步调用函数(延迟调用)

先看下面的FMX.Layouts.pas中一段代码 procedure TCustomScrollBox.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FMouseEvents := True; inherited; if (Button = TMouseButton.mbLeft) then begin MousePosToAni(X, Y); AniMouseDown(ssTouch in S

python 用字符串调用函数名

方法暂时看到两种: ①eval: def a():     print '1' func_a = 'a' eval(func_a)() 结果:1 ②.vars: 获取当前环境中的全部变量. def a():     print '1' func_a = 'a' vars()[func_a]() 结果:1 对于多个函数统一管理的时候,上面两种写法比较方便,可以直接通过管理函数名变量,来直接控制函数的调用. 比如: def a():     print '1'      def b():     p

C#的异步回调函数

关于C#的异步回调,在ActionScript 3.0当中 , 有关键字Function , 可以直接传class函数为回调函数.但是在C#当中,需要使用到委托,其中应用的最多的当属 : Action / Func .当然你可以使用关键字delegate来自定义委托.这里翼Action /  Func为例来讲解C#的异步回调,如果不了解C#的委托机制,需要自己先百度/Google一下,再来看这篇博客. BeginInvoke 方法用于启动异步调用.它与您需要异步执行的方法具有相同的参数,只不过还

谈.Net委托与线程——创建无阻塞的异步调用

前言 本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助.原英文文献可以在codeproject中搜索到. 介绍 这篇文章将介绍异步调用的实现机制及如何调用异步方法.大多数.NET开发者在经过delegate.Thread.AsynchronousInvocation之后,通常都会对以上概念产生混淆及误用.实际上,以上概念是.NET2.0版本中对并行编程的核心支持,基于概念上的错误认识有可能导致在实际的

谈.Net委托与线程——创建无阻塞的异步调用(一)

前言 本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助.原英文文献可以在codeproject中搜索到. 介绍 这篇文章将介绍异步调用的实现机制及如何调用异步方法.大多数.NET开发者在经过delegate.Thread.AsynchronousInvocation之后,通常都会对以上概念产生混淆及误用.实际上,以上概念是.NET2.0版本中对并行编程的核心支持,基于概念上的错误认识有可能导致在实际的