0

Red Hat Satellite API を使用して、RHEL4、5、6 システムのグループを作成しています。multiprocessing がなくても問題なく動作しますが、プロセスをスピードアップしたいので、 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

関数内の if..elif..else ブロックにコメントを付けると、正しい値が表示されます。ここで何が間違っているのかわかりません。助けてください。

4

3 に答える 3

0

バージョン 5.4.1 のある時点での Red Hat Satellite API 呼び出しの制限に問題があるようです。この制限に関する Red Hat の公式ドキュメントは見つかりませんでしたが、2 つのワーカーでテストしたところ、コードは問題なく動作しました。私は、Satellite API が処理できる 12 個の CPU コアを備えたワークステーションからコードを実行し、一部の呼び出しに対して 1 を返しました。ワーカー プロセスの数をハード コーディングする必要があります。

于 2013-11-13T11:28:49.797 に答える
0

ループ中にわかるように、 の値はRUNNINGKERNEL1intつのケースです。

<type 'int'> 1 PoolWorker-11

str.startswithそして、間違っているその整数で使用しようとしています。

>>> (1).startswith

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    (1).startswith
AttributeError: 'int' object has no attribute 'startswith'

これを修正するには、タイプを確認し、RUNNINGKERNELそれに基づいていくつかの新しい条件を追加します。

if isinstance(RUNNINGKERNEL, int):
   #do something
elif isinstance(RUNNINGKERNEL, str):
   if RUNNINGKERNEL.startswith("2.6.32"):
      ...
于 2013-11-13T09:43:16.150 に答える