本帖最后由 paypojie 于 2022-9-29 18:55 编辑
实现分布式多进程的代码报错
服务进程[Python] 纯文本查看 复制代码 # 分布式多进程之实现服务进程
# 第一步导入相关模块
import random, time, queue # 导入随机 时间 队列 模块
from multiprocessing.managers import BaseManager # 从多进程模块中的managers子模块中导入BaseManager 作用: 创建多进程管理器
from multiprocessing import freeze_support
# 创建两个相关的队列对象 分别是任务队列和结果队列 使用构造方法创建queue对象
task_queue = queue.Queue()
result_queue = queue.Queue()
# 定义两个显式函数 函数返回值是指向queue对象的变量
def g_task_queue():
global task_queue # 我也不知道这里用全局变量是什么意思 好像不用这行代码也不影响
return task_queue # 返回变量task_queue
# 和上面函数的作用差不多
def g_result_queue():
global result_queue # 我也不知道这里用全局变量是什么意思 好像不用这行代码也不影响
return result_queue # 返回变量result_queue
class QueueManager(BaseManager): # 定义一个QueueManager 继承自BaseManager
pass
if __name__ == '__main__': # 加这行代码 要不然会报错
freeze_support()
# 把之前两个队列注册到网络上 callable参数关联queue对象 不能用匿名函数 要不然无法正常运行
QueueManager.register('get_task_queue', callable=g_task_queue)
QueueManager.register('get_result_queue', callable=g_result_queue)
# 绑定ip,端口,验证码
manager = QueueManager(address=('127.0.0.1',5000),authkey=b'abc')
# 启动manager
manager.start()
# 通过网络访问queue对象
task = manager.get_task_queue()
result1 = manager.get_result_queue()
# 将任务写入到task队列
for i in range(10):
n = random.randint(0,10000)
print('put task %d' % n)
time.sleep(1)
task.put(n)
# 关闭queue
manager.shutdown()
print('结束')
# print('结束') # 无用的代码 但是不明白为什么 如果执行会在编辑器终端开头处多输出一行结束语句
任务进程
[Python] 纯文本查看 复制代码 import time, sys, queue
from multiprocessing.managers import BaseManager
# 定义一个和之前类似的BaseManager
class QueueManager(BaseManager):
pass
# 注册QueueManager 由于这个QueueManager只是从网络上获取queue 所以直接注册 提供名字就可以
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')
server_addr = '127.0.0.1'
print('连接到 %s' % server_addr)
# 绑定ip和验证码
m = QueueManager(address=('127.0.0.1',5000),authkey=b'abc')
# 连接至网络
m.connect()
# 通过网络访问queue对象
task = m.get_task_queue()
result = m.get_result_queue()
# 读取task 并将读取的值放到result队列
for i in range(10):
try:
n = task.get(timeout=1)
print('%d * %d' % (n,n))
r = '%d * %d = %d' % (n,n,n*n)
time.sleep(1)
result.put(r)
except queue.Empty:
print('queue is empty')
print('工作任务结束')
报错截图:
cmd下执行一个python文件
报错原因就是这些 不明白为什么 求求大神指出解决方案
链接 https://www.liaoxuefeng.com/wiki/1016959663602400/1017631559645600#0 |