2017-01-09 6 views
-1

Ich habe ein Python-Skript geschrieben, das wartet, bis gmail eine Benachrichtigung sendet, die darauf hinweist, dass eine E-Mail empfangen wurde. Dann wird der Inhalt analysiert und eine Datenbank wird durchsucht, dann werden die Datenbankdaten an den ursprünglichen Absender zurückgemailt.Python: Kontinuierliche Ausführung eines Abschnitts eines Skripts

Momentan kann das Skript nach Erhalt einer E-Mail keine weitere E-Mail verarbeiten, bis das Skript eine E-Mail gesendet hat. Ich frage mich, ob es für das Skript eine Möglichkeit gibt, ständig auf eine E-Mail zu warten. Wenn zu diesem Zeitpunkt zwei E-Mails zu ähnlichen Zeiten empfangen werden, wird der zweite nicht verarbeitet.

Ich denke Multithreading könnte eine Lösung sein, aber ich bin mir nicht sicher. Erstellen Sie möglicherweise einen neuen Thread für den folgenden Codeabschnitt ProcessEmail.py?

Tut mir leid, wenn ich schlecht erklärt habe, ich habe Mühe, dies angemessen zu erklären, zögern Sie nicht, nach mehr Informationen zu fragen.

EDIT: Statt Down Voting mich könnten Sie mir helfen, indem Sie mir sagen, was mehr Informationen ich sollte?

EDIT 2: Hier ist ein Codebeispiel, Ich versuche, die Möglichkeit zu haben, nach wie vor für eine E-Mail zu hören, während eine E-Mail in processEmail.py wird bearbeitet

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

Bitte geben Sie einen [MCVE] (http://stackoverflow.com/help/mcve) an, der das Problem veranschaulicht, das Sie haben –

+0

Um das Downvoting zu verhindern, sollten Sie lernen [wie man eine gute Frage stellt] (http: // stackoverflow .com/hilfe/wie-um-fragen). –

+0

Danke, ich habe die vorgeschlagene Änderung vorgenommen. – dperrie

Antwort

-1

Sie direkt von threading.Thread erben können und seine run Methode überschreiben:

class SomeTask(threading.Thread): 
    def run(self): 
     # Will be executed in separate thread 

den Faden über seine start Verfahren starten.

Die Kommunikation zwischen den Threads sollte über queues abgewickelt werden.

+0

Danke, ich werde es versuchen und zurückkommen! Zum Glück für mich will ich keine Kommunikation zwischen den Threads. – dperrie

Verwandte Themen