python多线程处理数据并获得子线程返回值
python多线程处理数据并获得子线程返回值
- 前言
- python3中的多线程
- 用方法包装函数
- 用类包装函数
- 获取子线程返回值
- 从类中返回值
- 其他方法
前言
python中采用多线程方式处理大数据量的数据是比较常见和便捷的方法,而有时还想获取每个子线程运行得到的结果,因此将多线程处理和获取子线程返回值的方法做一总结。
python3中的多线程
两种方式:用方法包装函数、用类包装函数。
用方法包装函数
_thread.start_new_thread (func, args[, kwargs])
其中,func是线程函数,args是传递给线程函数的参数且类型必须是tuple,kwargs是可选参数。
注意:
- 在python2中,多线程函数模块为
thread
,但是在python3中该模块已被_thread
继承,并重新定义了新的多线程模块threading
。_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.")
注意:
- 该方法因为需要
while 1
循环运行才能跑完多个线程,且无法自动退出,只能手动退出;- 由于
while 1
操作极耗内存,因此需加入sleep
机制缓解此情况;- 考虑到
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。
获取子线程返回值
获取子线程结果的方法不少,包括:
- 从类中返回值;
- 设置全局队列写入返回值;
- 通过multiprocessing.pool.ThreadPool获取返回值;
- 通过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来实现获取子线程结果的功能。
这里需要注意两点:
- 一定要先
join
子线程再get_result
获取子线程结果,否则只会返回最后一个运行的子线程的结果。这是因为加入join
阻塞后主线程必须等待所有子线程执行结束才会结束,那么每个子线程的结果都会通过task.get_result()
获得。- 一定不能将
join
加入MyThread的get_result
中,这样虽然同样会获取子线程结果,但是多线程执行会失效。这一操作实质上是将多个线程顺序执行,因为在子线程中加入join
阻塞后必须等待此子线程执行完才会执行下一个子线程,因此这一操作相当于将程序又变成单线程执行。
其他方法
其他方法暂时还没有研究和实操,等之后试过再写吧。
python多线程处理数据并获得子线程返回值相关推荐
- python 子线程返回值_python-从线程返回值
python-从线程返回值 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 12个解决方案 59 votes 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程 ...
- C语言 线程的回收与子线程返回值的接收
穿的参数为二级指针 需要用全局变量来返回子线程的返回值 // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存 ...
- java 获取子线程_Java 主线程获取子线程返回结果
1.自定义 package com.jgyang.com; public class MySyncThreadTest { public static void main(String[] args) ...
- Python 获取线程返回值获取
Python 获取线程返回值获取 思路 重写run方法,使用线程的get_result()方法获取返回结果 '''示例: 多线程访问百度,统计平均响应时间和错误率''' class MyThread( ...
- 线程返回值的方式介绍
博客 微博 相册 收藏 留言 关于我 线程返回值的方式介绍 博客分类: 多线程 Java代码 在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不 ...
- 统计文件种类数+获取子shell返回值的其它方法
前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...
- 实际开发问题解决记录: 需求是mysql执行查询 返回数据给前端 既要返回值不为NULL的列也要返回值为NULL的列(值为NULL的列列名返回给前端)
一.查询值不为NULL 的列 我们先来看数据库所有数据 执行的sql语句: select id,FCJ,comeCoalForecast from FCJ 查询结果如下: 看完执行查询所有数据的例子 ...
- python os.system_python中os.system()的返回值
最近遇到os.system()执行系统命令的情况,上网搜集了一下资料,整理如下,以备不时之需,同时也希望能帮到某些人. 一.python中的 os.system(cmd)的返回值与linux命令返回值 ...
- Boost(6):Boost.Python 如何转换 C++ 的参数和返回值类型
概述 在使用 Boost.Python 转换 C++ 程序到 Python 接口的过程中,我们经常需要处理 C++ 参数和返回类型,但是不同编程语言,支持的数据类型会很不一样.虽然对于 int/str ...
最新文章
- golang中文文档_Golang 标准库 限流器 time/rate 设计与实现
- GAN(Generative Adversarial Network,GAN)模型之:InfoGAN、WGAN、DCGAN模型
- Java实现有序数组和无序数组_【算法】字典的诞生:有序数组 PK 无序链表
- 基于Keras的LSTM多变量时间序列预测
- linux中gcc是什么指令,Linux gcc常用命令
- 『mcse 2008基础架构』Chapter 01 IP协议及配置方法 第1课网络连接及配置方法
- C语言浮点数据在内存中的存储方式
- SAP Hybris安装包里自带的Maven和Gradle
- 搜狗浏览器缓冲区溢出漏洞EXP
- 一个类的java代码_求一段java代码,定义一个类
- 2008 r2 server sql 中文版补丁_sql2008 sp3补丁下载-sql server 2008补丁包sp3中文版补丁【32/64位】-东坡下载...
- 读 Timothy Gowers 之 Mathematics: A Very Short Introduction
- 少数服从多数合理性的证明与证伪分析
- Docker_notes_practice
- 软件测试的工资高还是开发者工资高?
- 用Scrapy框架爬取豆瓣电影,构建豆瓣电影预测评分模型
- 水星mw325r设置无线服务器未响应,水星路由器325r设置WiFi隐藏信号方法
- vue-seamless-scroll公告组件的使用
- Oracle Database 12c Security - 1. Security for Today’s World
- php中fread用法,php fread()函数用法示例