python回调函数中使用多线程的方法


Posted in Python onDecember 25, 2017

下面的demo是根据需求写的简单测试脚本

#!/usr/bin/env python
# coding: utf-8
# 第一个列表为依赖组件和版本号,后面紧跟负责人名称
# 接着出现第二个以来组建列表,负责人为空了
# 所以根据需求需要对组件、版本号、负责人进行不同处理
# 这时在for循环中根据if判断,写回调函数处理
# 格式不一致数据的测试数据
a = [[u'tool-1', u'1.9.13'], u'xiaowang', u'xiaoqu', [u'tool-2', u'1.9.23'], [u'tool-3', u'1.9.33'], [u'tool-4', u'1.9.43'], u'pi',[u'tool-5', u'1.9.53']]
# a = [[u'tool-1', u'1.9.13'],u'xiaowang',[u'tool-2', u'1.9.23'],u'xiaowang', [u'tool-3', u'1.9.33'],u'xiaowang']
# a = [[u'tool-1', u'1.9.13']]
# [u'tool-1', u'1.9.13']
your_pro = a[0]
# print your_pro
# [u'xiaowang', u'xiaoqu', [u'tool-2', u'1.9.23']]
tmp = a[1:]
# print tmp
def git_callback(whole_v, proj_value, name_value):
  # 如果存在负责人存在
  try:
    if type(name_value[0]) is unicode:
      # 对除去列表0个索引的数据(依赖名和版本号)后面的数据进行遍历
      for i in name_value:
        # 碰到后面的数据是列表的进行回调
        if type(i) is list:
          tmp_index = whole_v.index(i)+1
          return git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:])
        else:
          # 打印依赖、版本号 负责人 开始
          print proj_value+i.split()+['start']
    else:
      # 如果负责人后跟的组件这种格式的列表数据为空
      # 也就是只有依赖和版本号列表数据,负责人为空,就打印依赖版本号
      ver = proj_value
      owner = name_value
      if type(owner[0]) is unicode:
        return git_callback(whole_v, ver, owner)
      else:
        print ver
        # 这里是为了判断是不是到列表的最后一位
        # 如果是最后一个值,且不是字符串的Unicode,而是列表
        # 就直接打印出项目
        if whole_v.index(owner[0]) == len(whole_v)-1:
          # 打印最后一个值
          print whole_v[-1:]
        else:
          # 这里比较绕,打印调试吧...
          new_ver = whole_v[whole_v.index(ver)+1]
          owner = whole_v[whole_v.index(ver)+2:]
          return git_callback(whole_v, new_ver, owner)
  except IndexError as e:
    print proj_value
    print e
git_callback(a, your_pro, tmp)

demo的output:

Boom:git_response pirogue$ python test.py
[u'tool-1', u'1.9.13', u'xiaowang', 'start']
[u'tool-1', u'1.9.13', u'xiaoqu', 'start']
[u'tool-2', u'1.9.23']
[u'tool-3', u'1.9.33']
[u'tool-4', u'1.9.43', u'pi', 'start']
[u'tool-5', u'1.9.53']
list index out of range

python的多线程

下面的代码是从主程序中,摘取出来的代码片段

from multiprocessing.dummy import Pool as ThreadPool
# 判断git查询返回的依赖数据格式不唯一的回调
def git_callback(whole_v, proj_value, name_value, git_cookie):
  # 
  whole_v = whole_v
  list_git = []
  if name_value:
    # print name_value
    for i in name_value:
      # print i
      if i:
        if type(i) is list:
          tmp_index = whole_v.index(i)+1
          return git_callback(whole_v, whole_v[whole_v.index(i)], whole_v[tmp_index:], git_cookie)
        else:
          git_cookie = str(git_cookie.split()[0])+' '+str(git_cookie.split()[1])
          list_git.append(tuple(git_cookie.split("?")+i.split()))
          print list_git
          pool = ThreadPool(100)
          result = pool.map(pool_git, list_git)
          print result
          pool.close()
          pool.join()          
  else:
    print proj_value

上面的多线程代码片段是一个回调函数,没有完全根据demo进行改装,有了demo根据需求改起来也不难,多调试就可以了。

python多线程接收多个参数

from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(100)
result = pool.map(pool_git, list_git)
print result
pool.close()
pool.join()

pool_git是你需要多线程调用的功能函数,list_git是pool_git函数需要接收的参数,默认情况下pool_git是一个接收一个参数的函数。

但是我们的功能常常设计的逻辑比较复杂,需要在pool_git中传入多个参数,这时list_git就应该给一个多个元组组成的列表。

stackoverflow上老外给的代码示例:

def multi_run_wrapper(args):
  return add(*args)
def add(x,y):
  return x+y
if __name__ == "__main__":
  from multiprocessing import Pool
  pool = Pool(4)
  results = pool.map(multi_run_wrapper,[(1,2),(2,3),(3,4)])
  print results
output
[3, 5, 7]

Stack Overflow上更多的答疑方便你更好的理解:

https://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments

相信聪明的你一定能看得懂~

多线程与多进程

from multiprocessing.dummy import Pool as ThreadPool

多线程进程池,绑定一个CPU核心

from multiprocessing import Pool

多进程,运行于多个cpu核心

如果你搞不懂是CPU密集型的任务,还是IO密集型的任务,那就用这个库两条import都写上,然后分别实例化跑一下就知道耗时长短,用法上只是在创建对象上改几个字母就行Pool和ThreadPool的互换。

总结

以上所述是小编给大家介绍的python回调函数中使用多线程的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
基于python编写的微博应用
Oct 17 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
EM算法的python实现的方法步骤
Jan 02 Python
python K近邻算法的kd树实现
Sep 06 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
详解Python中的测试工具
Jun 09 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
Python eval函数介绍及用法
Nov 09 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
python创建列表和向列表添加元素的实现方法
Dec 25 #Python
Python中装饰器高级用法详解
Dec 25 #Python
Python中最大最小赋值小技巧(分享)
Dec 23 #Python
利用python实现简单的邮件发送客户端示例
Dec 23 #Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 #Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 #Python
windows 下python+numpy安装实用教程
Dec 23 #Python
You might like
php在文件指定行中写入代码的方法
2012/05/23 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
《学会待客》教学反思
2014/02/22 职场文书
赡养老人协议书
2014/04/21 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
政工师工作总结2015
2015/05/26 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
初中班长竞选稿
2015/11/20 职场文书
方法汇总:Python 安装第三方库常用
2022/04/26 Python