2012-12-25 102 views
2

我有以下一段代碼,我試圖從郵箱的不同目錄中同時獲取郵件。但是,它正在顯示以下問題。附上縮短的堆棧跟蹤。Python多處理imaplib拋出錯誤

import multiprocessing as mlp 
import imaplib as impl 

def somefunc(dirc): 
    mail.select(dirc) 
    result, data = mail.uid("search", None, "All") 
    uids = data[0].split() 
    print dirc 
    for mail_id in uids: 
     result, data = mail.uid("fetch", mail_id, "(RFC822)") 

if __name__ == '__main__': 
    mail = impl.IMAP4_SSL("somedomain") 
    mail.login("username","password") 

    jobs = [] 
    p1 = mlp.Process(target = somefunc, args = ("INBOX",)) 
    jobs.append(p1) 
    p1.start() 
    p2 = mlp.Process(target = somefunc, args = ("Sent",)) 
    jobs.append(p2) 
    p2.start() 
    for i in jobs: 
     i.join() 

它拋出錯誤:

Process Process-2: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
Process Process-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
........ 
File "/usr/lib/python2.7/imaplib.py", line 859, in _command 
    raise self.abort('socket error: %s' % val) 
abort: socket error: [Errno 32] Broken pipe 
    typ, dat = self._simple_command(name, mailbox) 
........ 
error: [Errno 104] Connection reset by peer 

豈不是可以同時做IMAP連接???

謝謝... :)

回答

0

我的猜測是,你有,因爲你正試圖跨越的進程共享郵件插座連接對象的問題。相反,嘗試爲每個進程創建它的連接:

import multiprocessing as mlp 
import imaplib as impl 

def somefunc(domain, name, password, dirc): 
    mail = impl.IMAP4_SSL(domain) 
    mail.login(name, password) 
    mail.select(dirc) 
    result, data = mail.uid("search", None, "All") 
    uids = data[0].split() 
    print dirc 
    for mail_id in uids: 
     result, data = mail.uid("fetch", mail_id, "(RFC822)") 

if __name__ == '__main__': 
    jobs = [] 

    for box in ("INBOX", "Sent"): 
     p = mlp.Process(
       target = somefunc, 
       args = ("somedomain", "username", "password", box) 
      ) 
     jobs.append(p) 
     p.start() 

    for i in jobs: 
     i.join() 
+0

感謝的人,我就想通了,並已發佈了更新...感謝您的及時答覆... :) –

+0

長相酷似我貼在我的回答中,更新前20分鐘:-)我的答案是針對每個進程需要獨特的連接,因爲套接字。它確實與想要準備不同的郵箱目錄無關。 – jdi

+0

是的,我看到你的語言更適合人們......高興...... :) –