bonjour,
pour faire suite à ça http://forum.hardware.fr/hfr/Progr [...] 1783_1.htm ma classe python qui récupère des urls sur internet doit maintenant vérifier si par exemple une url est dans une table et si non l'ajouter.
Le soucis c'est qu'une fois sur 2 ça plante au niveau d'une des requetes fait par une des threads. D'après la doc, 2 mêmes threads ne peuvent partager la même connexion d'où mon problème... Y a t-il une solution ? Tout en évitant de créer une nouvelle connexion par threads. Si j'ai 20 threads, 20 connexion à MySQL risquent de charger un peu le serveur.
Code de base qui déconne si plusieurs threads:
Code :
- #!/usr/bin/env python2.6
- # -*- coding: utf-8 -*-
- import urllib2
- import MySQLdb
- # Threading version
- from threading import Thread
- from Queue import Queue
- class robot:
- def __init__(self):
- conn = MySQLdb.connect(host="localhost", user="user", passwd="", db="mabase" )
- self.db = db.conn.cursor()
- self.__num_worker = 4
- def queue_fast(self):
- def worker():
- while True:
- url = q.get()
- try:
- True
- self.execute(url)
- except:
- print "erreur avec", url
- q.task_done()
- q = Queue()
- for i in range(self.__num_worker):
- t = Thread(target=worker)
- t.setDaemon(True)
- t.start()
-
- self.db.execute("""SELECT url FROM site ORDER BY url_id ASC""" )
- data = self.db.fetchone()
- for d in data:
- q.put(data)
- data = self.db.fetchone()
- q.join() # block until all tasks are done
- def execute(self, url):
- """
- Recupere le contenu html...
- """
- self.db.execute("""SELECT url, date FROM cache WHERE url = %s""", (url))
-
- data = sql.fetchone()
- page = data[0]
- html = urllib2.urlopen(page).read()
- if html:
- try:
- self.db.execute("""UPDATE cache SET content = %s WHERE url = %s""", (html, page))
- return True
- except:
- return False
- else:
- print "erreur sur la page {0}".format(page)
- return False
- if __name__ == '__main__':
- bot = robot()
- bot.queue_fast()
|
donc des fois ça marche, la plupart du temps je m'en sors avec une erreur sql (_mysql_exceptions.OperationalError: 2006, 'MySQL server has gone away') et d'autre fois, le programme se bloque sans me rendre la main (je suppose qu'une des threads doit bloquer le q.join() qui attend).
je précise : python 2.6 avec MySQLdb 1.2.2 et MySQL-server 5.0.77 (sous arch)
merci