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实现的一个找零钱的小程序代码分享
Aug 25 Python
在Python的Django框架中实现Hacker News的一些功能
Apr 17 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
python实现自动发送邮件
Jun 20 Python
详解flask表单提交的两种方式
Jul 21 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 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无限分类的深入理解
2013/06/02 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Vue基础配置讲解
2019/11/29 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
pandas重新生成索引的方法
2018/11/06 Python
pandas分区间,算频率的实例
2019/07/04 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
大学生军训广播稿
2014/01/24 职场文书
护理助产毕业生的求职信
2014/03/02 职场文书
公司节能减排倡议书
2014/05/14 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android