2011-05-02 6 views
0

J'ai googlé ce sujet beaucoup, mais ne peut pas trouver une solution qui correspond à mes besoins :(Python multitraitement avec MySQL

J'ai un DB MySQL avec une table contenant adresses e-mail (10.000+).

Je voudrais lancer un traitement par lots sur eux toutes les 5 minutes.

donc je vais deviner Python est un bon choix pour récupérer le resultset de MySQL, puis appeler une ligne de commande avec l'adresse e-mail 'comme arguments

Comment puis-je le faire de la meilleure façon? hink d'obtenir le résultat complet de MySQL et ensuite avoir un tas de travail appelant la ligne de commande avec les arguments jusqu'à ce qu'il n'y ait plus d'adresse mail. Cela peut-il être fait d'une manière simple, mais stable?

Répondre

0

vous pouvez utiliser le module de multitraitement comme ceci:

from multiprocessing import Pool 
p = Pool() # let python choose the optimal number of processes (= number of CPU cores) 
def treat_email(email_adress): 
    # do the stuff you need with email address 

email_addresses = grab_the_list_from_mysql() # something like "select mail from my_user_table" 

p.map(treat_email, email_addresses) # this will treat all the emails in the X processes 
+0

J'ai essayé de modifier votre exemple pour un vrai: ' de multitraitement recueil HSC importation Piscine importation mysqldb p = Piscine() EMAIL_ADDRESSES = [] def treat_email (adresse_électronique): print "% s"% (adresse_électronique) conn = MySQLdb.connect (hôte = "localhost", utilisateur = "YYY", passwd = "XXX", db = "ZZZ") curseur = conn.cursor() cursor.execute ("SELECT email à partir de groupe de données par email") = lignes cursor.fetchall() pour la rangée en rangées: email_addresses.append (rangée [0]) curseur. close() conn.close() p.map (treat_email, EMAIL_ADDRESSES) ' Mais recueil HSC, il échoue avec AttributeError: objet 'module' n'a pas d'attribut 'treat_email' – user649542

+0

Cela fonctionne avec: si __name__ == '__main__': Merci beaucoup :) – user649542

0

Une alternative à l'utilisation d'un module ORM, vous pouvez vider les e-mails dans un fichier CSV:

SELECT name, address 
FROM email 
INTO OUTFILE '/tmp/emails.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 

De: Dump a mysql database to a plaintext (CSV) backup from the command line

Et post-traiter le fichier CSV en python:

import csv 
data = csv.reader(open('/tmp/emails.csv', 'rb'), delimiter=',') 
for row in data: 
    name, address = row 
    print '%s <%s>' % (name, address) 

CSV Lecture de fichiers et d'écriture: http://docs.python.org/library/csv.html

Lorsque votre traitement des fichiers très volumineux, vous voudrez peut-être utiliser la fonction file.readlines() pour empêcher Python de lire le fichier entier en mémoire:

with open('/tmp/emails.csv', 'rb') as f: 
    for line in f.readlines(): 
     name, address = line.split(',') 
     print '%s <%s>' % (name, address)