簡體   English   中英

在多個進程中使用imaplib.IMAP4_SSL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM