2011-03-17 7 views
1

J'ai un code multi-traitement que la base de données de recherche enregistre pour une certaine condition, quand il atteint la fin de la base de données, la boucle doit s'arrêter, comment puis-je faire cela? Voici le code:Comment quitter une boucle de multitraitement Python?

import psycopg2 
from multiprocessing import Pool 

conn = psycopg2.connect(a database) 
query=conn.cursor() 
query.execute(some query) 

def scanfile(): 
    try: row=query.fetchone() 
    except: return False #here the loop must stop 
    #do something with row... 

if __name__=='__main__': 
    pool=Pool() 
    while True: 
     pool.apply_async(scanfile) 
    pool.close() 
    pool.join() 
+1

Cela semble être une mauvaise idée. Check http://initd.org/psycopg/docs/usage.html#thread-and-process-safety –

+0

Jusqu'à présent, cela fonctionne, il saisit la ligne et fait des choses avec, mais le programme ne finit jamais. – Pablo

Répondre

1

Déplacez votre requête/curseur comme itérable et laissez le multiprocessing distribuer le travail pour vous.

import psycopg2 
from multiprocessing import Pool 


def scanfile(row): 
    #do something with row... 


if __name__ == '__main__': 
    conn = psycopg2.connect(a database) 
    query = conn.cursor() 
    query.execute(some query) 
    pool = Pool() 
    pool.map_async(scanfile, query).wait() 
    pool.close() 
    pool.join() 
+0

Excellent, il résout aussi le problème du curseur. – Pablo