CURDboy 问问各位,mysql 怎么多线程 insert 数据啊...

2017-12-19 17:55:43 +08:00
 Va1n3R

python3 写了个爬虫。
多线程爬取数据写入数据库
一开始使用的是 sqllite3,一直提示 database is blocked,后来发现 sqllite 不支持多线程读写
然后谷歌搜了一下,看到了别人推荐使用 mysql 来做这种任务...我只会基础的 CURD 操作,用了简单的多线程来操作,然而 mysql 貌似也不能直接多线程插入数据,stackoverflow 里面的老哥们说是需要建立连接池...头疼,之前只接触过基础的操作,请各位 V2er 赐教
python3 代码:

def getExin():
    while not Q.empty():
        i = Q.get()
        .*
        try:
            .*
        except :
            continue
        try:
            c.execute("INSERT INTO exin (username, password) \
                  VALUES (%s,'%s')" % (username, password))
            conn.commit()
        except:
            pass


for i in range(0, 99475):
    if len(str(i)) < 5:
        i = (5 - len(str(i))) * "0" + str(i)
    Q.put(i)

threads = []

conn = connect(user='root', password='root', database='test')
c = conn.cursor()
for i in range(800):
    x = threading.Thread(target=getExin,args=())
    threads.append(x)
for t in threads:
    t.start()
c.close()
print("All done")
3702 次点击
所在节点    Python
24 条回复
catinred
2017-12-20 10:16:05 +08:00
中间用个队列把数据存起来 然后起个线程批量插入就好了
exiaohao
2017-12-20 10:57:48 +08:00
这种事吧,celery 就好啦 gevent 开起来妈妈再也不用担心并发上不去了
搞 thread 多麻烦
Va1n3R
2017-12-20 16:20:08 +08:00
@2ME 已经采用了 executemany 啦
Va1n3R
2017-12-20 16:20:48 +08:00
@exiaohao 之前没有写过协程、异步。昨晚看了一下,启发很大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416052

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX