python的多线程和java的多线程_python多线程与多进程

最近在单机服务器上用python跑一个机器学习模型,数据量在千万级别,运行时间跑了1个半小时,而且服务器的CPU利用率很低。就想到用多线程和多进程来并行加速跑程序,原先就只知道一点模糊的概念,还没有真正实现过,趁着这个机会就好好研究下python的多线程和多进程。

多线程

python的多线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global interpreter lock。任何python线程执行前,必须获得GIL锁,然后执行每执行100字节码,解释器自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁,实际上把所有线程的执行代码都上了锁,所以多线程在python中只能交替运行;即使100个线程跑在100核CPU上,也只能用到一个核。

多进程

一个进程在接到新任务时,就可以复制出一个子进程,来处理新任务。

多线程与多进程的区别

线程在同一个内存空间中运行;进程有独立的内存。

线程间共享对象更容易,但必须采取额外的措施来进行对象同步,确保两个线程不会同时写入同一个对象,不会发生竞态条件。

由于对象同步增加了编程开销,多线程变成更容易出错,另一房买呢,多进程编程则很容易实现。

与进程相比,线程的开销更低,生成进程比线程花更多的时间。

由于python GIL的局限性,线程无法利用多个CPU内核实现真正的并行化,而多进程则没有任何这样的限制。

进程调度有OS处理,而线程调度有python解释器来完成

子进程是可以中断、终止的,而子线程则不是,必须等待线程中止或join。

结论:

多线程应该用于涉及IO操作密集或用户交互程序

多进程应该用于计算密集型程序。

程序的不同部分可以使用不同形式的并行化

python concurrent.future内置模块

多线程demo:

with ThreadPoolExecutor(max_workers=n) as tpe:

tpe.submit(func_name, args)

多进程demo:

with ProcessPoolExecutor(max_workers=n) as ppe:

for i in ppe.map(func_name,iterable_object):

feature_df = feature_df.append(i, ignore_index = True) #将所有结果保存到一个df或者list

其他应用可以参考官网文档:https://docs.python.org/3/library/concurrent.futures.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值