我知道如何在Java中实现异步操作
实例化新主题 - >线程做耗时的事情(磁盘IO或网络活动) - >线程完成其工作并将结果传递给主线程
我试图在python中做同样的事但却找不到方法......
我读过有关async
和await
,multiprocessing.Pool
的文章。两者都没有让我清楚地知道如何实现同样的目标。
我找到的最接近的方式是multiprocessing.Pool.apply_async(Callable,Iterable,Callback)
。但是这个东西不能在类中实例化,因为它需要包含在if __name__=="__main__"
中,__name__
是我的类名。
在Python中执行异步的任何优雅方式? 谢谢!
答案 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);