Multiprocess и PyVmomi повышает _pickle.PicklingError - PullRequest
0 голосов
/ 21 ноября 2018

Я пишу скрипт для параллельного запроса нескольких центров.У меня уже есть один скрипт, который делает это циклично, но он очень медленный, так как соединение с каждым vcenter выполняется один за другим.Завершение занимает несколько минут, а в некоторых случаях это неприемлемо.

Итак, у меня была идея распараллелить функцию, которая возвращает сеанс, и затем сохранить эти сеансы в массиве или словаре, чтобы использовать их длязапросите vecenters.

Это код

from pyVmomi import vim
import threading
from multiprocessing import Process
from multiprocessing import Manager

serverList = ["vcenter1", "vcenter2", "vcenter3", "vcenter4",
              "vcenter5", "vcenter6", "vcenter7", "vcenter8",
              "vcenter9", "vcenter10", "vcenter11", "vcenter12",
              "vcenter13", "vcenter14", "vcenter15", "vcenter16",
              "vcenter17", "vcenter18"]

def createVcenterSession(sessions, vcenter="", user="", passwd="", ssl=False):
    url= vcenter + "mydomain.com"

    if not ssl:
        from pyVim.connect import SmartConnectNoSSL
        service_instance = SmartConnectNoSSL(host=url,
                                             user=user,
                                             pwd=passwd,
                                             port=int(443))
    else:
        from pyVim.connect import SmartConnect
        service_instance = SmartConnect(host=url,
                                        user=user,
                                        pwd=passwd,
                                        port=int(443))
if __name__ == '__main__':

    manager = Manager()
    global sessions_dict
    sessions_dict = manager.dict()

    d = [] ##Here, I will Store the processes
    for a in serverList:
        d.append(Process(target=createVcenterSession, args=(sessions_dict, a, "USERNAME","PASSWD", False)))
    ### now d is filled with all the new processes

    ####start everyone
    for a in d:
        a.start()

    print (d)
    ####wait for everyone to complete
    for a in d:
        a.join()

    print (sessions_dict) ##Show my sessions

Дело в том, что код вызывает эту ошибку

Process Process-16:
Traceback (most recent call last):
  File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "dashBoard.py", line 54, in createVcenterSession
    sessions[vcenter] = service_instance
  File "<string>", line 2, in __setitem__
  File "/usr/lib/python3.5/multiprocessing/managers.py", line 716, in _callmethod
    conn.send((self._id, methodname, args, kwds))
  File "/usr/lib/python3.5/multiprocessing/connection.py", line 206, in send
    self._send_bytes(ForkingPickler.dumps(obj))
  File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
    cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <class 'pyVmomi.VmomiSupport.vim.ServiceInstance'>: attribute lookup vim.ServiceInstance on pyVmomi.VmomiSupport failed

Я понимаю, что проблема в чем-то сМногопроцессорная библиотека может помещать класс ServiceInstance в управляемый словарь.Если изменить строку, присваивающую словарь, с

    sessions[vcenter] = service_instance

на

    sessions[vcenter] = "any string"

, то это работает как чудо, но я теряю сессию:)

Есть идеи?

Заранее спасибо

Зик

...