Гугл диск многопоточный ход файлов PYTHON - PullRequest
0 голосов
/ 04 мая 2018

Извините за мои английские. Я использую pyDryve для Google Drive API. И я хочу переместить файлы из одной папки в другую, используйте для этой многопоточности.

        pool = ThreadPoolExecutor(max_workers=2)
# i have list of file
 for file in date_val:
                    pool.submit(self.start_rename_move_process, file)


def start_rename_move_process(self, file):
    try:
        print(file['title'])

        # Retrieve the existing parents to remove
        move_file = thread_drive.g_drive.auth.service.files().get(fileId=file['id'],
                                                          fields='parents').execute()

        previous_parents = ",".join([parent["id"] for parent in move_file.get('parents')])

        # Move the file to the new folder
        thread_drive.g_drive.auth.service.files().update(fileId=file['id'],
                                                       addParents=MOVE_FOLDER_ID,
                                                       removeParents=previous_parents,
                                                       fields='id, parents').execute()

    except BaseException as e:
        print(e)

у меня ошибка:

[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:2217)

Мой вопрос: почему в одном потоке все работает нормально, но если я делаю 2 потока, у меня ошибка

[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:2217)

1 Ответ

0 голосов
/ 21 марта 2019

Недавно я столкнулся с той же ошибкой, которая оказалась проблемой с библиотекой httplib2, как описано в этом руководстве Thread Safety от Google.

Библиотека google-api-python-client построена поверх httplib2 библиотека, которая не является потокобезопасной. Поэтому, если вы работаете как многопоточное приложение, каждый поток, который вы делаете запросы from должен иметь свой собственный экземпляр httplib2.Http ()

В руководстве приводятся два решения этой проблемы:

Самый простой способ обеспечить потоки собственным httplib2.Http () случаи должны либо отменить конструкцию его в служебный объект или передать экземпляр через http-аргумент методу вызовов.

# Create a new Http() object for every request
def build_request(http, *args, **kwargs):
    new_http = httplib2.Http()
    return apiclient.http.HttpRequest(new_http, *args, **kwargs)
service = build('api_name', 'api_version', requestBuilder=build_request)

# Pass in a new Http() manually for every request
service = build('api_name', 'api_version')
http = httplib2.Http()
service.stamps().list().execute(http=http)
...