![](/img/trans.png)
[英]What does the output mean of imaplib.IMAP4_SSL().search in Python?
[英]using imaplib.IMAP4_SSL in multiple processes
我想在许多进程中重用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()
但是我得到了与套接字有关的错误:
imaplib.IMAP4.abort:套接字错误:[Errno 32]管道损坏
我认为这是因为进程正在写入imaplib.IMAP4_SSL拥有的同一套接字,所以我尝试添加multiprocessing.Lock以防止同时访问:
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
无论如何都是imaplib.IMAP4.abort: command: UID => socket error: EOF
。
我正在使用Ubuntu 16.04。 任何建议都将受到高度赞赏。
更新:在堆栈跟踪中发现另一个异常,可能导致所有其他异常:
ssl.SSLError:[SSL:DECRYPTION_FAILED_OR_BAD_RECORD_MAC]解密失败或记录Mac的记录不正确(_ssl.c:2217)`
似乎此问题与多处理相关的Python ssl问题
你不能 进程之间不共享SSL上下文; 没有它,加密状态将不同步。
如果需要在同一IMAP收件箱上执行多个并发操作,则需要与服务器建立多个连接。
似乎是SSL问题。 SSL封装的套接字无法在多个进程上重用。 我现在正在使用线程,如果没有Lock,一切都会好起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.