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实现360皮肤按钮控件示例
Feb 21 Python
使用python绘制人人网好友关系图示例
Apr 01 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
Python reduce()函数的用法小结
Nov 15 Python
Python实现带参数与不带参数的多重继承示例
Jan 30 Python
详解Django 中是否使用时区的区别
Jun 14 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
Python实现封装打包自己写的代码,被python import
Jul 12 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/02/16 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
Javascript 倒计时源代码.(时.分.秒) 详细注释版
2011/05/09 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
python文件与目录操作实例详解
2016/02/22 Python
使用Python更换外网IP的方法
2018/07/09 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
python绘制简单彩虹图
2018/11/19 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
学习python可以干什么
2019/02/26 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
电子商务自荐书范文
2014/01/04 职场文书
煤矿安全生产标语
2014/06/06 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS