ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 线程化时的 Gmail

Pri*_*ign 5 ssl multithreading python-3.x gmail-api

我能够获取包含 Python 查询的电子邮件列表,但是当我从线程内运行代码时,出现错误:

ssl.SSLError: [SSL: WRONG_VERSION_NUMBER]
Run Code Online (Sandbox Code Playgroud)

这是我调用线程的方式:

Thread(target=get_messages_for_label, args=({'recruitment'})).start()
Run Code Online (Sandbox Code Playgroud)

错误发生在这一行:

response = service.users().labels().list(userId=user_id).execute()
Run Code Online (Sandbox Code Playgroud)

但是,当我在没有线程的情况下运行它(作为简单的方法调用)时,它工作得很好。

很难共享中间的代码,因为在线程启动和错误发生之间有相当多的方法调用。

任何帮助,将不胜感激。

Pri*_*ign 8

我刚刚找到这篇文章:https ://developers.google.com/api-client-library/python/guide/thread_safety 。

根据文档,Gmail API 构建在 Httplib2 之上,而 Httplib2 不是线程安全的。

作为解决方法,您可以向每个命令执行方法提供 http 对象的新实例。

就我而言

service.labels().list().execute()
Run Code Online (Sandbox Code Playgroud)

变成:

service.users().labels().list(userId=user_id)\
   .execute(http=self.__get_credentials().authorize(httplib2.Http()))
Run Code Online (Sandbox Code Playgroud)