suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Python – MySQL-Einfügefehler beim Multithreading

Wenn ich einen Crawler schreibe, möchte ich die gecrawlten Daten in der Datenbank speichern. Auf jeder Seite gibt es viele Einträge. Beispielsweise kann eine Person viele Besucher haben, also füge ich sie in die Entladeschleife ein

                try:
                    sql_visitor='INSERT INTO visitor (ownername,owneruid,visitorname,visitoruid,visittime) VALUE ("%s",%d,"%s",%d,"%s")'%(ownername,owneruid,visitorname,visitoruid,visitortime)
                    print sql_visitor
                    self.cursor.execute(sql_visitor)
                    self.connect.commit()
                except Exception as e:
                    print e

Eine Seite und ein Thread. Mir gefiel die Langsamkeit nicht und ich habe fünf davon geöffnet

max_threads=5
        while uid < 8000000 or threadlist:
            for thread1 in threadlist:
                if not thread1.is_alive():
                    threadlist.remove(thread1)
            while len(threadlist) < max_threads and uid < 8000000:
                uid+=1
                thread2=threading.Thread(target=run,args=(uid,))
                thread2.setDaemon(True)
                thread2.start()
                threadlist.append(thread2)
            time.sleep(5)

Läuft reibungslos:

INSERT INTO Visitors (ownername,owneruid,visitorname,visitoruid,visittime) VALUE ("huosai7",4893,"Liang2017",7252799,"2017-5-22 21:06")

INSERT INTO personalinfo (ownername,owneruid, jifen,huajiao,xiaomijiao,jinbi,haoyou,zhuti,rizhi,xiangce,fenxiang,kongjianfangwenliang,youxiangyanzheng,shipinrenzheng,juzhudi,chushengdi,shangcifabiaoshijian,shangcihuodongshijian,zuihoufangwen,zhuceshijian,zaixianshijian,shengri,xingbie) VALUE("huosa.i7 ",4893 , 0,0,0,0,0,0,0,0,0,0,0,0,"","","2100-01-01 12:00","2100-01-01 12: 00 ","2100-01-01 12:00","2004-1-3 19:28",0,"2100-01-01 12:00",0)
INSERT INTO Besucher (Besitzername, Besitzer-ID, Besuchername , Visitorsuid,Visittime) VALUE ("龙乐",4894,"Liang2017",7252799,"2017-5-22 21:06")
(1062, "Duplicate Eintrag '4894-7252799-2017-05-22 21: 06 :00‘ für den Schlüssel ‚PRIMARY‘“) shangcihuodongshijian ,zuihoufangwen,zhuceshijian,zaixianshijian,shengri,xingbie) VALUE("龙乐",4894,0,0,0,0,0,0,0,0,0,0,0,0,"","" , „2100-01-01 12:00“, „2100-01-01 12:00“, „2100-01-01 12:00“, „2004-1-3 20:21“, 0, „2100-“ 01 -01 12:00",0)
.....

Also habe ich max_thread auf 10 gesetzt und das Ergebnis ist wie folgt:

INSERT INTO Besucher (Besitzername, Besitzer-ID, Besuchername, Besucher-ID, Besuchszeit) WERT („xiao61“, 4889, „Liang2017“, 7252799, „2017-5-22 21:06“)

(2006, „MySQL-Server ist verschwunden“)

INSERT INTO personalinfo (ownername,owneruid,jifen,huajiao,xiaomijiao,jinbi,haoyou,zhuti,rizhi,xiangce,fenxiang,kongjianfangwenliang,youxiangyanzheng,shipinrenzheng,juzhudi,chushengdi,shangcifabiaoshijian,shangcihuodongshijian,zuihoufangwen,zhuceshijian,zaixianshi jian ,shengri, xingbie ) VALUE("xiao61",4889,0,0,0,0,0,0,0,0,0,0,0,0,"","","2100-01-01 12:00" , „2100-01-01 12:00“, „2100-01-01 12:00“, „2004-1-3 15:56“,0, „2100-01-01 12:00“,0)

(2006, „MySQL-Server ist verschwunden“)

INSERT INTO Visitors (ownername,owneruid,visitorname,visitoruid,visittime) VALUE („confused cool bear“,4897,“Liang2017“,7252799,“2017-5-22 21:06“)

(2006, „MySQL-Server ist verschwunden“)

INSERT INTO personalinfo (ownername,owneruid,jifen,huajiao,xiaomijiao,jinbi,haoyou,zhuti,rizhi,xiangce,fenxiang,kongjianfangwenliang,youxiangyanzheng,shipinrenzheng,juzhudi,chushengdi,shangcifabiaoshijian,shangcihuodongshijian,zuihoufangwen,zhuceshijian,zaixianshi jian ,shengri, xingbie ) VALUE("confused cool bear",4897,611,0,1655,0,0,2,0,0,0,34,0,0,"","","2007-3-27 00: 37“, „27.03.2007 00:37“, 27.03.2007 00:37“, 3.1.2004 21:08“,0,“01.01.2100 12:00“,1 )

(2006, „MySQL-Server ist verschwunden“)
......

Sie können sehen, dass 2006 herauskam, und dann habe ich max_thread auf 30 gesetzt und die Ergebnisse sind wie folgt:

Das ist es, ist es detailliert genug? Was brauchst du noch?

伊谢尔伦伊谢尔伦2722 Tage vor1120

Antworte allen(1)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-06-13 09:26:41

    看这里,我猜你是用的是pymysql,它的线程安全描述为1,对应的pep249里面做了详细的描述:

    Threads may share the module, but not connections.

    线程可以共享模块但不能共享连接。这也就是说你可能得在每个线程中创建一个连接。

    呐~为什么不用orm来做呢?

    Antwort
    0
  • StornierenAntwort