首页 > 解决方案 > 多处理模块如何提供远程并发?

问题描述

我知道在concurrent.futures模块中,ProcessPoolExecutor子类使用多处理模块来产生多个进程。

是否有可能在远程机器上实现这种并发?如果是,不同进程如何共享或分配内存?

在远程机器上实现这种多处理还有哪些其他挑战?

我已经尝试使用这种方法进行本地并发。我只想知道远程并发是否可以帮助我获得更好的性能。

标签: pythonpython-3.xparallel-processingpython-multiprocessingconcurrent.futures

解决方案


如果您有多台机器可供使用,那么绝对可以通过使用它们来获得更好的性能。由于远程机器的延迟和通信开销,它只对更大的工作负载有意义。

在行业中,像 (Py)Spark 和 (Py)Mesos 这样的工具更适合这项任务。

您可以使用multiprocessing,这是官方文档中的示例:

运行以下命令为远程客户端可以访问的单个共享队列创建服务器:

>>> from multiprocessing.managers import BaseManager
>>> from queue import Queue
>>> queue = Queue()
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue', callable=lambda:queue)
>>> m = QueueManager(address=('', 50000), authkey=b'abracadabra')
>>> s = m.get_server()
>>> s.serve_forever()

一个客户端可以访问服务器,如下所示:

>>> from multiprocessing.managers import BaseManager
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue')
>>> m = QueueManager(address=('foo.bar.org', 50000), authkey=b'abracadabra')
>>> m.connect()
>>> queue = m.get_queue()
>>> queue.put('hello')

另一个客户端也可以使用它:

>>> from multiprocessing.managers import BaseManager
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue')
>>> m = QueueManager(address=('foo.bar.org', 50000), authkey=b'abracadabra')
>>> m.connect()
>>> queue = m.get_queue()
>>> queue.get()
'hello'

推荐阅读