python多线程与多进程 超简单使用

Python 的GIL限制了多核CPU的性能,对于IO密集型的程序,采用多线程能显著提高运行速度;但对于计算密集型的程序,多线程就没多少用了,采用多进程编程,就能充分利用多核CPU的性能,CPU占用率能达到100%。

  • 下面是在阿里云服务器上测试的数据:

配置:CPU:Xeon, E5-2680, 2.5GHz, 4核; 内存:16G, DDR4; 硬盘:100G, SSD

def run():
    pool = multiprocessing.Pool(processes = 8)
    result = []
    contents = []
    for ix, row in df.iterrows():
        content = row['title'] + " " + row['content']
        contents.append(content)
    result = pool.map(get_one_article_keys, contents)
    pool.close()
    pool.join()
    t1 = time.time()
    print 'time pass:{:.3f}'.format(t1-t0)

def get_one_article_keys(content):
    try:
        tags2 = jieba.analyse.textrank(content, topK=20)
        print multiprocessing.current_process()
        return ','.join(tags2)
    except Exception,e:
        print "get_one_article_keys():%s" % str(e)
        return ''

执行计算密集型任务的结果:

multi_wayProcessesTime(s)
多进程4378
多进程8381
多进程20464
多线程83174

对于一台四核的机器,设置进程数为对应的内核数,效率是最高的;当设置比内核多的进程时,在创建python进程时开销占时比较多,造成设置为20个进程数时,时间比4个进程多了1分钟多。
因此,设置进程数与实际内核数相同,运行最快。

multiprocessing.cpu_count() # 获取内核数

一、多进程编程

1,map方式

import multiprocessing
import time

def do_something(i):
    time.sleep(i)
    print 'good:%d' % i
    return 'good:%d' % i

print multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes = 4)
result = pool.map(do_something, range(10))
pool.close()
pool.join()
for res in result:
    print res

result 可以得到多进程执行do_something返回的结果,为list

1,map方式为阻塞模式,主进程必须等待所有子进程执行完毕了才能继续;
2,还有一种方式为非阻塞模式,map_async,主进程不等待子进程是否完毕,接着向下执行。

2,apply 方式

...
result = []
for i in range(10):
    result.append(pool.apply(do_something, (i,)))
...

同map_async一样,还有非阻塞模式 apply_async

二、多线程编程

多线程实现也非常简单,跟多进程基本一样,只是创建pool时略有不同。

from multiprocessing.dummy import Pool as ThreadPool
import time

def do_something(i):
    time.sleep(i)
    print 'good:%d' % i
    return 'good:%d' % i

pool = ThreadPool(processes = 4)
result = pool.map(do_something, range(10))
pool.close()
pool.join()
for res in result:
    print res

Python专题:http://kekefund.com/tags/Python/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值