Python – MySQL-Einfügefehler beim Multithreading
伊谢尔伦
伊谢尔伦 2017-06-13 09:24:41
0
1
1118

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?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

Antworte allen(1)
巴扎黑

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

Threads may share the module, but not connections.

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

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

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage