Python中关于for循环与线程的使用问题
我现在是
def handle_mysql(id):
# 修改数据库的数据
pass
id_list = […] # 里面有一百个 id
for i in id_list:
handle_mysql ( i )
但是这样速度比较慢,然后我想用下面的方法,但是不知道是否可行
def handle_mysql(id):
# 修改数据库的数据
pass
id_list = […] # 里面有一百个 id
for i in id_list:
线程 1,调用 handle_mysql ( i )
线程 2,调用 handle_mysql ( i )
线程 3,调用 handle_mysql ( i )
请问这样可以吗?或者您有什么更好的建议能否告诉我?
Python中关于for循环与线程的使用问题
一条任务一个线程啊!有必要吗
我无法理解你的问题
就弄两三个线程就行
multiprocessing.dummy.Pool.map
最好是使用 aiomysql 吧
把所有 id 塞到一个并发安全的队列里,然后起 N 个线程不断地从队列里取 id,执行逻辑,直到队列为空。
mysql 表 确认得是 innodb 的,否则锁表就慢慢等(的确当前还是有人默认用 myisam 表的)
来个线程 /进程池 吧,自己再确保同时跑的任务不要超过 CPU 核数 /超线程数
有一个重要的事情说三遍:
mysql 不是线程安全的,mysql 不是线程安全的,mysql 不是线程安全的
你如果使用多线程那么需要给每个线程创建单独的 mysql 连接。
你同时创建过多的线程和连接最大的可能性是直接把数据库给挂死了。
最科学的办法是按照你的 mysql 的性能创建一个连接池,可以使用 DBUtils 这个包。
你这边多线程从连接池申请连接。
然后你就会发现你的性能瓶颈在 mysql 上了
用协程吧,
我一般优先合并 sql,比如多条 insert into 变成一条 insert into (),(),()…
这种事情找一个成熟 orm,人家一定有最好的优化方式在大量插入
个人猜测可能提升并不大,因为目测 python 应该是用户级线程,但是操作了网络 IO,整个进程陷入内核,导致其他线程阻塞
But,我没用过 python 进程,所以对此了解的不够全面,只凭猜测。
建议楼主自己写出来测试一下时间(当然也期望回复一下实验结果);第二个建议是可以考虑使用 epoll 或者 select 处理这个试试;第三个建议是如果是系统线程,最好使用连接池来管理,不然容易死
线程可以用于这种 io 型任务,但不要在线程任务多开 conn


