如何在python中实现类似Java的异步行为?

时间:2017-04-18 11:37:00

标签: python multithreading asynchronous

我知道如何在Java中实现异步操作

实例化新主题 - >线程做耗时的事情(磁盘IO或网络活动) - >线程完成其工作并将结果传递给主线程

我试图在python中做同样的事但却找不到方法...... 我读过有关asyncawaitmultiprocessing.Pool的文章。两者都没有让我清楚地知道如何实现同样的目标。

我找到的最接近的方式是multiprocessing.Pool.apply_async(Callable,Iterable,Callback)。但是这个东西不能在类中实例化,因为它需要包含在if __name__=="__main__"中,__name__是我的类名。

在Python中执行异步的任何优雅方式? 谢谢!

1 个答案:

答案 0 :(得分:2)

线程基础

查看threading模块。

一个例子:

from threading import Thread

# instanciate a new thread
t = Thread(target=my_task)
# let it do the time-consuming stuff
t.start()
# do extra stuff while t is working
do_extra_stuff()
# wait for t to finish
t.join()

获取任务结果

但是,如果要从my_task获取值,则需要使用全局变量,可变参数或将任务包装到列出Thread的类中。

以下是包装类的示例:

class MyThread(Thread):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.result = None

    def run(self):  # this is the Thread method you need to override
        # the time consuming stuff
        self.result = some_result

# same as before, but using the new class, so no need to specify target.
t = MyThread()
t.start() # will call t.run() for you. Never call t.run yourself (you'll lose every benefit from using Thread)
t.join() # wait for t to be finished before getting result
print(t.result)

传递参数

要将参数传递给任务(包括回调),您可以将它们作为类字段放入并在construcor中填充它们,或者使用args来自Thread的construc的t = Thread(target=task_with_parametters, args=(arg1, arg2)) kwarg,如这个:

Thread

task_with_parametters会像这样致电task_with_parametters(arg1, arg2)

HAL_Init();       
SystemClock_Config();  
MX_GPIO_Init();
appEntry = (pFunction) *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);

    HAL_UART_DeInit(&huart1);
    HAL_DeInit();
    HAL_RCC_DeInit();

    HAL_SuspendTick();


    systemReset();  
    SCB->VTOR = 0x8008000;
    __set_MSP(appStack);