python分布式进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python分布式进程相关的知识,希望对你有一定的参考价值。

分布式进程可以布置在局域网之中,把安排的任务注册到局域网内,不同主机之间就可以传递信息,从而分配任务和反馈,不过并不适合返回大量数据;

首先需要一个服务器server,用来存放数据,其他机器通过局域网内ip访问到:

# -*- coding: utf-8 -*-
#注册进程,manager/server
import multiprocessing
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

# 发送任务的队列:
task_queue = multiprocessing.Queue()
# 接收结果的队列:
result_queue = multiprocessing.Queue()

# 为解决__main__.<lambda> not found问题
def get_task_queue():
    return task_queue

# 为解决__main__.<lambda> not found问题
def get_result_queue():
    return result_queue


# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register(get_task_queue, callable=get_task_queue)
QueueManager.register(get_result_queue, callable=get_result_queue)
# 绑定端口5000, 设置验证码‘abc‘:
manager = QueueManager(address=(192.168.10.138, 5000), authkey=abc)

freeze_support()
#manager.start() 不能正常运行时,使用以下方法作为进程通信服务器
server = manager.get_server()
server.serve_forever()
使用server.serve_forever()来开启进程通信服务器,本身进程就阻塞了,永远地作为通信数据的存储进程。
其他进程可以访问、修改 服务器进程的通信数据来达到传输信息的目的。


# _*_ coding:utf-8 _*_
""" a work manager sample """
import Queue
from multiprocessing.managers import BaseManager

import time


class QueueManager(BaseManager):
    pass
    
# 从网络上获取Queue
QueueManager.register(get_task_queue)
QueueManager.register(get_result_queue)

# 连接服务器
server_addr = 192.168.10.141
print Connect to server %s ... % server_addr
manager = QueueManager(address=(server_addr, 5000), authkey=abc)
manager.connect()

# 获取Queue对象
task = manager.get_task_queue()
result = manager.get_result_queue()

注意注册到服务器的ip和端口要和通信服务器端的一致。

局域网内各进程间接地通过 服务器来交换信息。

 

 



以上是关于python分布式进程的主要内容,如果未能解决你的问题,请参考以下文章

[Python3] 043 多线程 简介

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

代码片段:Shell脚本实现重复执行和多进程

python中的多线程和多进程编程

[python](windows)分布式进程问题:pickle模块不能序列化lambda函数

python 多进程和多线程3 —— asyncio - 异步IO