python multiprocessing.Pool与Red Hat Satellite API的值不正确

python multiprocessing.Pool与Red Hat Satellite API的值不正确,python,multiprocessing,Python,Multiprocessing,我正在使用Red Hat Satellite API为RHEL4、5、6系统创建组。如果没有多重处理,它可以正常工作,但我想加快处理速度,所以考虑使用multiprocessing.Pool,但不知何故得到了错误的值。这是我的密码: CLIENT = xmlrpclib.Server(SATELLITE_URL, verbose=0) KEY = CLIENT.auth.login(SATELLITE_LOGIN, SATELLITE_PASSWORD) def ADD_SYSTEMS(ITE

我正在使用Red Hat Satellite API为RHEL4、5、6系统创建组。如果没有多重处理,它可以正常工作,但我想加快处理速度,所以考虑使用multiprocessing.Pool,但不知何故得到了错误的值。这是我的密码:

CLIENT = xmlrpclib.Server(SATELLITE_URL, verbose=0)
KEY = CLIENT.auth.login(SATELLITE_LOGIN, SATELLITE_PASSWORD)

def ADD_SYSTEMS(ITEM):
    SYSTEMID = ITEM['id']
    SYSTEMNAME = ITEM['name']
    RUNNINGKERNEL = CLIENT.system.getRunningKernel(KEY,SYSTEMID)
    print type(RUNNINGKERNEL), RUNNINGKERNEL, multiprocessing.current_process().name
    if RUNNINGKERNEL.startswith("2.6.32"):
    CLIENT.systemgroup.addOrRemoveSystems(KEY,"ALL_RHEL6_SYSTEMS",SYSTEMID,True)
    elif RUNNINGKERNEL.startswith("2.6.18"):
    CLIENT.systemgroup.addOrRemoveSystems(KEY,"ALL_RHEL5_SYSTEMS",SYSTEMID,True)
    else:
    CLIENT.systemgroup.addOrRemoveSystems(KEY,"ALL_RHEL4_SYSTEMS",SYSTEMID,True)

if __name__ == '__main__':
    ACTIVESYSTEMS = CLIENT.system.listActiveSystems(KEY)
    PSIZE = multiprocessing.cpu_count()
    P = multiprocessing.Pool(processes=PSIZE)
    P.map(ADD_SYSTEMS, ACTIVESYSTEMS)
    P.close()
    P.join()

CLIENT.auth.logout(KEY)
当我运行代码时,我得到以下错误:

<type 'str'> 2.6.18-348.12.1.el5 PoolWorker-1
<type 'str'> 2.6.18-348.18.1.el5 PoolWorker-8
<type 'str'> 2.6.18-371.1.2.el5 PoolWorker-9
<type 'str'> 2.6.18-348.16.1.el5 PoolWorker-10
<type 'str'> 2.6.18-348.16.1.el5 PoolWorker-3
<type 'str'> 2.6.9-100.ELsmp PoolWorker-8
<type 'str'> 2.6.18-371.1.2.el5 PoolWorker-4
<type 'str'> 2.6.32-358.23.2.el6.x86_64 PoolWorker-2
<type 'int'> 1 PoolWorker-11
Traceback (most recent call last):
  File "./1rhnGroupMaintenance.py", line 42, in <module>
    P.map(ADD_SYSTEMS, ACTIVESYSTEMS)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 227, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 528, in get
    raise self._value
AttributeError: 'int' object has no attribute 'startswith'
<type 'str'> 2.6.9-100.ELsmp PoolWorker-1
2.6.18-348.12.1.el5-1
2.6.18-348.18.1.el5-8
2.6.18-371.1.2.el5-9
2.6.18-348.16.1.el5-10
2.6.18-348.16.1.el5-3
2.6.9-100.ELsmp-8
2.6.18-371.1.2.el5-4
2.6.32-358.23.2.el6.x86_64-2
1-11
回溯(最近一次呼叫最后一次):
文件“/1rhnGroupMaintenance.py”,第42行,在
P.map(添加系统、活动系统)
文件“/usr/lib/python2.7/multiprocessing/pool.py”,第227行,在地图中
返回self.map\u async(func,iterable,chunksize).get()
get中的文件“/usr/lib/python2.7/multiprocessing/pool.py”,第528行
提升自我价值
AttributeError:“int”对象没有属性“StartWith”
2.6.9-100.ELsmp-1

如果我在函数中注释If..elif..else块,则print显示正确的值。我不知道我做错了什么。请提供帮助。

正如您在循环过程中看到的,
RUNNINGKERNEL
的值为
int
,有一种情况:

<type 'int'> 1 PoolWorker-11
要解决这个问题,您可以检查
RUNNINGKERNEL
的类型,并在此基础上添加一些新条件

if isinstance(RUNNINGKERNEL, int):
   #do something
elif isinstance(RUNNINGKERNEL, str):
   if RUNNINGKERNEL.startswith("2.6.32"):
      ...

看起来像是远程过程调用

RUNNINGKERNEL = CLIENT.system.getRunningKernel(KEY,SYSTEMID)
有时返回一个字符串(“内核某物”),对于一个特定的键,返回一个int(1)

尝试在int上使用
startswith
失败,因为它是一个字符串方法

我会检查罪犯id上远程过程调用的实际答案,或者如果答案是预期的,请确保您实际处理字符串

RUNNINGKERNEL = str(CLIENT.system.getRunningKernel(KEY,SYSTEMID))
或明确处理int的情况:

如果isinstance(RUNNINGKERNEL,int): 通过 else isinstance(RUNNINGKERNEL,str):
#你的一堆ifs

问题似乎在于版本5.4.1在某个时间点对Red Hat Satellite API调用的限制。我没有找到任何关于此限制的Red Hat官方文档,但当我使用2名工作人员进行测试时,代码运行良好。我在工作站上运行的代码有12个CPU核,SatelliteAPI可以处理这些CPU核,其中一些调用返回1个。我必须对工作进程的数量进行硬编码。

我需要理解为什么我在那里得到值1。如果我只运行print语句而不是If..elif..else块,那么我将获得所有字符串值。是什么导致RUNNINGKERNEL值返回1?@SumitGoel对此一无所知,可能是if-elif块中对
addOrRemoveSystems
的调用导致了该问题。实际上,在调用之前就得到了错误。感谢您的回复!问题似乎在于版本5.4.1中对Red Hat Satellite API调用的限制。我不得不将worker进程硬编码为2,它工作得很好。感谢您的回复!
RUNNINGKERNEL = str(CLIENT.system.getRunningKernel(KEY,SYSTEMID))