一个干净的API,用于在python中进行函数调用

问题描述 投票:3回答:2

我想在线程中调用一个函数。用传统的API看起来像:

from threading import Thread
import numpy as np
a = np.random.rand(int(1e8),1)

Thread(target=np.savez_compressed, args=('/tmp/values.a', dict(a=a))).start()

[我想知道是否有Python语言使用更干净的API进行此线程调用,而没有定义特定于np.savez_compressed的函数。

例如(伪代码)样式的东西:

@make_threaded
np.savez_compressed('/tmp/values.a', dict(a=a))

不幸的是装饰器只能应用于函数定义,因此上面的伪代码不合法​​。

EDIT:我不是专门针对装饰器API。而是一种使函数调用线程化的更干净的方法

python python-3.x python-multithreading
2个回答
3
投票
concurrent.futures模块提供了更高级的API,用于将线程或进程用于单个操作。

concurrent.futures

如果您不希望使用整个Executor API,则可以定义自己的帮助程序来在线程中运行函数。

from concurrent.futures import ThreadPoolExecutor executor = ThreadPoolExecutor() executor.submit(np.savez_compressed, '/tmp/values.a', dict(a=a))


0
投票
在这里操作:

我发现的另一个解决方案是将装饰器与装饰器“经典” API结合使用:

def threaded(call, *args, **kwargs): """Execute ``call(*args, **kwargs)`` in a thread""" thread = threading.Thread(target=call, args=args, kwargs=kwargs) thread.start() return thread threaded(np.savez_compressed, '/tmp/values.a', dict(a=a))

© www.soinside.com 2019 - 2024. All rights reserved.