python多线程pool_实例分析Python多进程池 multiprocessing Pool的使用

Python多进程池 multiprocessing Pool用法示例

本文实例讲述了Python多进程池 multiprocessing Pool用法。分享给大家供大家参考,具体如下:

1. 背景

由于需要写python程序, 定时、大量发送htttp请求,并对结果进行处理。

参考其他代码有进程池,记录一下。

2. 多进程 vs 多线程

c++程序中,单个模块通常是单进程,会启动几十、上百个线程,充分发挥机器性能。(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客)

shell脚本中,都是多进程后台执行。({ ...} &, 可以参考我之前的博客,实现shell并发处理任务)

python脚本有多线程和多进程。由于python全局解锁锁的GIL的存在,一般建议 CPU密集型应该采用多进程充分发挥多核优势,I/O密集型可以采用多线程。

尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。

实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。

GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。

3. multiprocessing pool使用例子

对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了

#coding=utf-8

import logging

import time

from multiprocessing import Pool

logging.basicConfig(level=logging.INFO, filename='logger.log')

class Point:

def __init__(self, x = 0, y= 0):

self.x = x

self.y = y

def __str__(self):

return "(%d, %d)" % (self.x, self.y)

def fun1(point):

point.x = point.x + 3

point.y = point.y + 3

time.sleep(1)

return point

def fun2(x):

time.sleep(1)

logging.info(time.ctime() + ", fun2 input x:" + str(x))

return x * x

if __name__ == '__main__':

pool = Pool(4)

#test1

mylist = [x for x in range(10)]

ret = pool.map(fun2, mylist)

print ret

#test2

mydata = [Point(x, y) for x in range(3) for y in range(2)]

res = pool.map(fun1, mydata)

for i in res:

print str(i)

#end

pool.close()

pool.join()

print "end"

运行结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

(3, 3)

(3, 4)

(4, 3)

(4, 4)

(5, 3)

(5, 4)

end

4. 参考

Python 多进程 multiprocessing.Pool类详解

Python 多线程和多进程编程总结

Python的全局锁问题

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值