2017-01-09 8 views
-1

私は、メールが受信されたことを示す通知をgmailがプッシュするのを待つpythonスクリプトを書いています。次に、内容が解析され、データベースが検索され、データベースのデータが元の送信者に電子メールで戻されます。Python:スクリプトの一部を継続的に実行しています

現在、電子メールが受信されると、スクリプトは電子メールで返信されるまで別の電子メールを処理できません。スクリプトが電子メールを継続的に聞く方法があるのだろうかと思っています。同じ時点で2つの電子メールが受信された場合、この時点では2番目の電子メールは処理されません。

私はマルチスレッドが解決策かもしれないとは思いますが、わかりません。おそらく、以下のコードのprocessEmail.pyセクションのための新しいスレッドを作成しますか?

申し訳ありません私がひどく説明した場合は、これを十分に説明するのに苦労しています。詳細はお気軽にお問い合わせください。

編集:私に投票するのではなく、私が追加する必要のある情報を教えてください。

EDIT 2:ここでのコード例である電子メールがprocessEmail.py

import imaplib2 
import time 
import subprocess 
from threading import * 
from subprocess import call 
import processEmail 

class Idler(object): 
    def __init__(self, conn): 
     self.thread = Thread(target=self.idle) 
     self.M = conn 
     self.event = Event() 

    def start(self): 
     self.thread.start() 

    def stop(self): 
     self.event.set() 

    def join(self): 
     self.thread.join() 

    def idle(self): 
     while True: 
      if self.event.isSet(): 
       return 
      self.needsync = False 
      def callback(args): 
       if not self.event.isSet(): 
        self.needsync = True 
        self.event.set() 
      self.M.idle(callback=callback) 
      self.event.wait() 
      if self.needsync: 
       self.event.clear() 
       self.dosync() 

    def dosync(self): 
     print "An email has been received, please wait...\n" 
     self.execute() 

    def execute(self): 
     processEmail.main() 


M = imaplib2.IMAP4_SSL("imap.gmail.com") 
M.login("email_address","email_pass") 
M.select("Folder") 
idler = Idler(M) 
idler.start() 
x = False 
while not x: time.sleep(0.1) 
+0

あなたの持っている問題を示す[MCVE](http://stackoverflow.com/help/mcve)を入力してください。 –

+0

[あなたに良い質問をする方法]を学ぶべきであるdownvotingを防ぐために(http:// stackoverflow .com/help/how-to-ask)。 –

+0

ありがとう、私は提案された変更を行った。 – dperrie

答えて

-1

を処理されている間、私はあなたが直接threading.Threadから継承することができ、まだメールをリッスンする能力を持ってしようとしていますし、

class SomeTask(threading.Thread): 
    def run(self): 
     # Will be executed in separate thread 
はその startメソッドを経由してスレッドを開始

:そのrunメソッドをオーバーライドします。

スレッド間の通信は、queuesで処理する必要があります。

+0

ありがとう、私はこれを行って、あなたに戻ってきます!私にとっては幸運にも、スレッド間の通信は望ましくありません。 – dperrie

関連する問題