python多线程处理数据并获得子线程返回值

  • 前言
  • python3中的多线程
    • 用方法包装函数
    • 用类包装函数
  • 获取子线程返回值
    • 从类中返回值
    • 其他方法

前言

python中采用多线程方式处理大数据量的数据是比较常见和便捷的方法,而有时还想获取每个子线程运行得到的结果,因此将多线程处理和获取子线程返回值的方法做一总结。


python3中的多线程

两种方式:用方法包装函数、用类包装函数。

用方法包装函数

_thread.start_new_thread (func, args[, kwargs])

其中,func是线程函数,args是传递给线程函数的参数且类型必须是tuple,kwargs是可选参数。

注意:

  1. 在python2中,多线程函数模块为thread,但是在python3中该模块已被_thread继承,并重新定义了新的多线程模块threading
  2. _thread模块提供了低级别的、原始的线程以及一个简单的锁,它相比于threading模块的功能比较有限。

以下是一个通过_thread模块实现多线程的简单示例:

import _thread
import timedef print_time(thread_name, delay):c = 0while c < 5:time.sleep(delay)c += 1res = "%s: %s" % (thread_name, time.ctime(time.time()))print(res)# return res  # 作为线程运行时函数中的return是无意义的if __name__ == "__main__":# 用方法包装线程try:try:_thread.start_new_thread(print_time, ("Thread-1", 1, ))_thread.start_new_thread(print_time, ("Thread-2", 2, ))except:pass# 谨慎使用此操作:极其耗费cpuwhile 1:time.sleep(0.1)except KeyboardInterrupt:print("You stop the threading.")

注意:

  1. 该方法因为需要while 1循环运行才能跑完多个线程,且无法自动退出,只能手动退出;
  2. 由于while 1操作极耗内存,因此需加入sleep机制缓解此情况;
  3. 考虑到threading模块构建类进行多线程操作更友好,因此实际应用中不采用此方法。

用类包装函数

首先通过threading模块构建多线程类MyThread.py

import threading
import time# MyThread.py线程类
class MyThread(threading.Thread):def __init__(self, func, args=()):super(MyThread, self).__init__()self.func = funcself.args = argsdef run(self):time.sleep(1)self.func(*self.args)

其中,func是线程函数,arg是传递给线程函数的参数且类型是tuple。

获取子线程返回值

获取子线程结果的方法不少,包括:

  1. 从类中返回值;
  2. 设置全局队列写入返回值;
  3. 通过multiprocessing.pool.ThreadPool获取返回值;
  4. 通过concurrent.futures,结合set_result和result方法获取返回值等。

从类中返回值

从类中返回值是非常常见简便的方法,该方法的多线程类可以将上文中的MyThread.py文件稍作修改:

import threading
import time# MyThread.py线程类
class MyThread(threading.Thread):def __init__(self, func, args=()):super(MyThread, self).__init__()self.func = funcself.args = argsself.result = []def run(self):time.sleep(1)self.result = self.func(*self.args)def get_result(self):try:return self.resultexcept Exception:return None

在该方法的基础上,就可以实现返回子线程结果的功能了。
以下通过一个简单示例来说明:

from MyThread import MyThreaddef add(a, b):c = a + breturn cif __name__ == "__main__":# 用类包装线程ls = [23, 89]thr = []# 创建4个线程for i in range(4):task = MyThread(add, (ls[0], ls[1]))task.start()task.join()thr.append(task.get_result())print(thr)

这里写了一个简单的加法函数add,通过调用多线程类MyThread来实现获取子线程结果的功能。

这里需要注意两点:

  1. 一定要join子线程再get_result获取子线程结果,否则只会返回最后一个运行的子线程的结果。这是因为加入join阻塞后主线程必须等待所有子线程执行结束才会结束,那么每个子线程的结果都会通过task.get_result()获得。
  2. 一定不能join加入MyThreadget_result中,这样虽然同样会获取子线程结果,但是多线程执行会失效。这一操作实质上是将多个线程顺序执行,因为在子线程中加入join阻塞后必须等待此子线程执行完才会执行下一个子线程,因此这一操作相当于将程序又变成单线程执行。

其他方法

其他方法暂时还没有研究和实操,等之后试过再写吧。

python多线程处理数据并获得子线程返回值相关推荐

  1. python 子线程返回值_python-从线程返回值

    python-从线程返回值 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 12个解决方案 59 votes 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程 ...

  2. C语言 线程的回收与子线程返回值的接收

    穿的参数为二级指针 需要用全局变量来返回子线程的返回值 // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存 ...

  3. java 获取子线程_Java 主线程获取子线程返回结果

    1.自定义 package com.jgyang.com; public class MySyncThreadTest { public static void main(String[] args) ...

  4. Python 获取线程返回值获取

    Python 获取线程返回值获取 思路 重写run方法,使用线程的get_result()方法获取返回结果 '''示例: 多线程访问百度,统计平均响应时间和错误率''' class MyThread( ...

  5. 线程返回值的方式介绍

    博客 微博 相册 收藏 留言 关于我 线程返回值的方式介绍 博客分类: 多线程 Java代码   在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不 ...

  6. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  7. 实际开发问题解决记录: 需求是mysql执行查询 返回数据给前端 既要返回值不为NULL的列也要返回值为NULL的列(值为NULL的列列名返回给前端)

    一.查询值不为NULL 的列 我们先来看数据库所有数据 执行的sql语句:  select id,FCJ,comeCoalForecast from FCJ 查询结果如下: 看完执行查询所有数据的例子 ...

  8. python os.system_python中os.system()的返回值

    最近遇到os.system()执行系统命令的情况,上网搜集了一下资料,整理如下,以备不时之需,同时也希望能帮到某些人. 一.python中的 os.system(cmd)的返回值与linux命令返回值 ...

  9. Boost(6):Boost.Python 如何转换 C++ 的参数和返回值类型

    概述 在使用 Boost.Python 转换 C++ 程序到 Python 接口的过程中,我们经常需要处理 C++ 参数和返回类型,但是不同编程语言,支持的数据类型会很不一样.虽然对于 int/str ...

最新文章

  1. golang中文文档_Golang 标准库 限流器 time/rate 设计与实现
  2. GAN(Generative Adversarial Network,GAN)模型之:InfoGAN、WGAN、DCGAN模型
  3. Java实现有序数组和无序数组_【算法】字典的诞生:有序数组 PK 无序链表
  4. 基于Keras的LSTM多变量时间序列预测
  5. linux中gcc是什么指令,Linux gcc常用命令
  6. 『mcse 2008基础架构』Chapter 01 IP协议及配置方法 第1课网络连接及配置方法
  7. C语言浮点数据在内存中的存储方式
  8. SAP Hybris安装包里自带的Maven和Gradle
  9. 搜狗浏览器缓冲区溢出漏洞EXP
  10. 一个类的java代码_求一段java代码,定义一个类
  11. 2008 r2 server sql 中文版补丁_sql2008 sp3补丁下载-sql server 2008补丁包sp3中文版补丁【32/64位】-东坡下载...
  12. 读 Timothy Gowers 之 Mathematics: A Very Short Introduction
  13. 少数服从多数合理性的证明与证伪分析
  14. Docker_notes_practice
  15. 软件测试的工资高还是开发者工资高?
  16. 用Scrapy框架爬取豆瓣电影,构建豆瓣电影预测评分模型
  17. 水星mw325r设置无线服务器未响应,水星路由器325r设置WiFi隐藏信号方法
  18. vue-seamless-scroll公告组件的使用
  19. Oracle Database 12c Security - 1. Security for Today’s World
  20. php中fread用法,php fread()函数用法示例

热门文章

  1. 海南化学分析实验室设计工艺归纳
  2. android清单文件的作用,Android 清单文件
  3. 一个项目的经验教训:关于打乱和拆分数据
  4. DPDK内存管理总结
  5. 强网杯团队赛---Misc
  6. 解决2019款macbookpro -16寸 外接显示器风扇不停的转,温度特别高
  7. 酷开系统壁纸模式,百变画作颠覆想象
  8. svn基础学习之常用知识
  9. Darknet官方文档(含Yolo-V2和V3在win和Linux训练测试步骤、计算mAP、调参优化等)
  10. word保留格式简体转换成繁体宏