使用 imaplib.IMAP4_SSL多个流程



我想重用imaplib。IMAP4_SSL多个进程的实例,因此我不必多次登录。 下面是一些代码:

import imaplib
from multiprocessing import Process
def fetch(mail_client):
mail_client.uid('fetch', b'1', 'BODY[TEXT]')
def main():
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.login(user='**', password='***')
c.select('inbox')
procs = [Process(target=fetch, args=(c,)) for _ in range(100)]
for p in procs:
p.start()
for p in procs:
p.join()
if __name__ == '__main__':
main()

但是我收到与套接字相关的错误:

伊马普利布。IMAP4.中止: 套接字错误: [错误 32] 管道损坏

我认为这是因为进程正在写入同一个套接字,即 imaplib。IMAP4_SSL,所以我尝试添加多处理。锁定以防止同时访问:

import imaplib
from multiprocessing import Process, Lock

def fetch(mail_client, lock):
with lock:
mail_client.uid('fetch', b'1', 'BODY[TEXT]')

def main():
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.login(user='engineering@epallet.com', password='Qwe=1dSAzxc+%')
c.select('inbox')
lock = Lock()
procs = [Process(target=fetch, args=(c, lock)) for _ in range(100)]
for p in procs:
p.start()
for p in procs:
p.join()

if __name__ == '__main__':
main()

但错误仍然存在。 一些进一步的调查表明,第一个进程成功调用 mail.uid,但第二个进程无论如何都会imaplib.IMAP4.abort: command: UID => socket error: EOF

我正在使用 Ubuntu 16.04。 任何建议都非常感谢。

更新:在堆栈跟踪中发现另一个异常,也许它会导致所有其他异常:

啪。SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] 解密失败或不良记录 mac (_ssl.c:2217)'

似乎这个问题是相关的 多处理的 Python SSL 问题

你不能。SSL 上下文不会在进程之间共享;没有它,加密状态将不同步。

如果需要对同一个 IMAP 收件箱执行多个并发操作,则需要与服务器建立多个连接。

似乎是 SSL 的问题。SSL 包装的套接字不能在多个进程中重用。我现在正在使用线程,没有 Lock 一切都很好。

相关内容

  • 没有找到相关文章

最新更新