使用ZMQ进行数组数据的远程函数调用
项目描述
🙅 Zerofun
使用ZMQ进行数组数据的远程函数调用。
注意:Zerofun已重新编写,不再使用ZMQ,而是使用原始Python套接字,现在称为Portal。您可以继续使用Zerofun,但它将不再接收更新。要抑制此信息,请安装zerofun==2.3.1
。要升级,请运行pip install portal
并访问github.com/danijar/portal。API几乎相同,但允许更灵活的函数参数,并提供更高的性能和可靠性。
概述
Zerofun提供了一个您可以将函数绑定到的Server
和一个可以调用消息并接收其结果的Client
。函数输入和结果都是平铺的NumPy数组
的字典。数据以高效的方式发送,无需序列化,以最大化吞吐量。
安装
pip install zerofun
示例
此示例在同一个Python程序中使用子进程运行服务器和客户端,但它们也可以是运行在不同机器上的独立Python脚本。
def server():
import zerofun
server = zerofun.Server('tcp://*:2222')
server.bind('add', lambda data: {'result': data['foo'] + data['bar']})
server.bind('msg', lambda data: print('Message from client:', data['msg']))
server.run()
def client():
import zerofun
client = zerofun.Client('tcp://:2222')
client.connect()
future = client.add({'foo': 1, 'bar': 1})
result = future.result()
print(result) # {'result': 2}
client.msg({'msg': 'Hello World'})
if __name__ == '__main__':
import zerofun
server_proc = zerofun.Process(server, start=True)
client_proc = zerofun.Process(client, start=True)
client_proc.join()
server_proc.terminate()
特性
提供了一些生产力和性能特性
- 请求批处理:服务器可以批量处理请求,以便用户函数接收堆叠的数组字典,并将函数结果分割并发送回相应的客户端。
- 多线程:服务器可以使用线程池并行处理多个请求。可选地,每个函数也可以请求自己的线程池,以便函数可以阻塞(例如,进行速率限制),而不会阻塞其他函数。
- 异步客户端:客户端可以通过使用
Future
对象发送多个重叠请求,并在需要时等待结果。最大并发请求数量可以限制,以避免当服务器比客户端慢时请求积累。 - 错误处理:在服务器函数中引发的异常会报告给客户端,并在
future.result()
中引发,或者如果用户没有存储未来对象,则在下一个请求中引发。工作异常也可以通过使用server.check()
在服务器应用程序中重新引发。 - 心跳:当客户端一段时间内没有从服务器收到结果时,可以发送ping请求,这样就可以等待计算时间较长的结果,而不必假设连接丢失。
- 并发性:具有异常转发功能的
Thread
和Process
实现,可以被父进程强制终止,这是Python线程原生不支持的功能。还有可停止的线程和进程,可用于协作关闭。 - 降低GIL负载:
ProcServer
的行为与正常Server
相同,但使用后台进程批量请求并分发结果,大大减少了主进程中服务器工作者的GIL负载。
问题
请为每个问题打开一个GitHub问题。随着时间的推移,我们将把常见问题添加到README中。
项目详情
关闭
zerofun-2.4.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ebfc69a7d741d4ec5c54426058a2403d7deba3c20cce8414d88ec055a1089d00 |
|
MD5 | 95037260c686dc56254d7dd48e176230 |
|
BLAKE2b-256 | 63331fb0585e0ad8fc60b09fa6bb0b47300df6ce04db24aedb81793391d6a93e |