Also:
- SQL Befehle besser machen
LIKE sollte wenn möglich vermieden werden
keine Werte direkt in den SQL String einfügen
Nich über das ganze Resultat iterieren und nochmals einen Wert abfragen -> direkt in Query nehmen
- Threads nicht übermässig erstellen, lieber 2 Threads die dauernd laufen und miteinander kommunizieren (z.B. mit einer Queue)
Also nach den Änderungen siehts etwa so aus (natürlich ungetestet):
Code: Alles auswählen
def spider_url_thread(input_queue):
while True:
artikel, userid, dbid = input_queue.get()
print 'tu was damit'
def spider_db_thread(output_queue):
while True:
ts = int(time.time())
cursor.execute("""SELECT id, artikel, userid FROM orders WHERE status = 0 AND start = ?""", (ts, ))
#cursor.fetchall() # brauchts das wirklich? gehts nicht direkt mit dem cursor?
for row in cursor:
dbid = row[0]
artikel = str(row[2])
userid = str(row[3])
cursor.execute("""UPDATE orders SET status = 1 WHERE id = ?""", (dbid,))
output_queue.put((artikel, userid, dbid))
time.sleep(0.5)
q = Queue.Queue()
t1 = Thread(target=spider_db_thread, args=(q,))
t2 = Thread(target=spider_url_thread, args=(q,))
t1.start()
t2.start()
Und falls die Daten in der DB nicht so schnell ändern kannst du anstatt Polling (pro Sekunde 2 mal abfragen ob eine Zeit erreich wurde) auch einfach den nächsten Timestamp auslesen (eine Query mit LIMIT 1 und ODER BY start ASC) und solange den Thread schlafen legen entweder per time.sleep(start-jetzt) oder mit einem threading.Timer() die Funktion aufrufen.
*edit* wie kommt man eigentlich darauf, dass timeouts von GUI Toolkits seien besser als ein einfacher sleep? Beim sleep wird nicht wirklich was gemacht
*edit 2*
Die nicht pollende Funktion würde vielleicht so aussehen wobei ich bei den DB-Zugriffen nicht wirklich sicher bin (fetch one), hab da schon lange nichts mehr damit gemacht.
Code: Alles auswählen
def spider_db_thread(output_queue):
while True:
cursor.execute("""SELECT id, start, artikel, userid FROM orders WHERE status = 0 ORDER BY start ASC LIMIT 1""")
now = int(time.time())
row = cursor.fetchone()
# berechne Zeit bis start erreicht wird
diff = int(row[1])-now
# schlafe bis start erreicht wurde
time.sleep(diff)
dbid = row[0]
artikel = str(row[2])
userid = str(row[3])
cursor.execute("""UPDATE orders SET status = 1 WHERE id = ?""", (dbid,))
output_queue.put((artikel, userid, dbid))