关于python 多线程往上搜索到两种写法:
from concurrent.futures import ThreadPoolExecutor
buffer_size= 1024 #缓冲区大小
my_list = [1,2,3,4,5]
def cal_data(para1):
print(para1+para1)
# 方案1
executor = ThreadPoolExecutor(20)
for item in my_list:
executor.submit(cal_data,item )
# 方案2
for item in my_list:
with ThreadPoolExecutor(max_workers=20 ) as pool: # 线程池
pool.map(cal_data, item)
不知道以上两种写法有什么差别,那个效率更快呢?
第二个问题,实际项目中cal_data函数中包含删除和写入mysql数据库操作,所以就算开100个线程,内存32G,感觉还是受限数据库读取效率,所以有什么办法在开多个进程的时候提高数据库操作效率呢?
方案一快些。方案二每次循环都创建了新的线程池对象,比较浪费资源。
看下这篇博客,也许你就懂了,链接:玩转python多线程第一个问题:哪一种更快应该是根据你具体的应用场景进行测试,如果比较简单应该是可以不用考虑效率问题的
第二个问题:对于关系型数据库,例如Mysql在做并发的操作的时候提高效率的关键还是锁机制,例如Innodb引擎中利用行锁取代表锁提高并发效率,这种时候修改python代码不如从数据库的角度来优化操作的SQL语句,例如使用SELECT ... FOR UPDATE,SELECT ... FOR UPDATE SKIP LOCKED等来将业务组合下写成事务。
总结:建议优化对数据库操作。