我想重用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 一切都很好。