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

python-从线程返回值

我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级?

12个解决方案

59 votes

我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它.puts将其结果作为参数接收到队列中。 家长可以随意将其设置为.get或.get_nowait。

队列通常是在Python中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!

Alex Martelli answered 2019-11-10T12:55:40Z

12 votes

如果要调用join()等待线程完成,则只需将结果附加到Thread实例本身,然后在join()返回之后从主线程检索它。

另一方面,您没有告诉我们您打算如何发现线程已完成并且结果可用。 如果您已经有这样做的方法,它可能会为您(和我们,如果您要告诉我们)指出获得结果的最佳方法。

Peter Hansen answered 2019-11-10T12:56:14Z

12 votes

您应该将Queue实例作为参数传递,然后将返回对象.put()放入队列。 您可以通过queue.get()收集放置的任何对象的返回值。

样品:

queue = Queue.Queue()

thread_ = threading.Thread(

target=target_method,

name="Thread1",

args=[params, queue],

)

thread_.start()

thread_.join()

queue.get()

def target_method(self, params, queue):

"""

Some operations right here

"""

your_return = "Whatever your object is"

queue.put(your_return)

用于多线程:

#Start all threads in thread pool

for thread in pool:

thread.start()

response = queue.get()

thread_results.append(response)

#Kill all threads

for thread in pool:

thread.join()

我使用此实现,对我来说非常有用。 我希望你这样做。

Fatih Karatana answered 2019-11-10T12:56:55Z

7 votes

使用lambda包装目标线程函数,然后使用队列将其返回值传递回父线程。 (您的原始目标函数将保持不变,而无需额外的队列参数。)

示例代码:

import threading

import queue

def dosomething(param):

return param * 2

que = queue.Queue()

thr = threading.Thread(target = lambda q, arg : q.put(dosomething(arg)), args = (que, 2))

thr.start()

thr.join()

while not que.empty():

print(que.get())

输出:

4

Petr Vepřek answered 2019-11-10T12:57:27Z

7 votes

我很惊讶没有人提到您可以将其传递给可变对象:

>>> thread_return={'success': False}

>>> from threading import Thread

>>> def task(thread_return):

... thread_return['success'] = True

...

>>> Thread(target=task, args=(thread_return,)).start()

>>> thread_return

{'success': True}

也许这是我不知道的主要问题。

jcomeau_ictx answered 2019-11-10T12:57:59Z

5 votes

另一种方法是将回调函数传递给线程。 这提供了一种简单,安全和灵活的方式,可以随时从新线程中将值返回给父级。

# A sample implementation

import threading

import time

class MyThread(threading.Thread):

def __init__(self, cb):

threading.Thread.__init__(self)

self.callback = cb

def run(self):

for i in range(10):

self.callback(i)

time.sleep(1)

# test

import sys

def count(x):

print x

sys.stdout.flush()

t = MyThread(count)

t.start()

Vijay Mathew answered 2019-11-10T12:58:23Z

3 votes

您可以使用同步队列模块。

考虑您需要从具有已知ID的数据库中检查用户信息:

def check_infos(user_id, queue):

result = send_data(user_id)

queue.put(result)

现在,您可以像这样获取数据:

import queue, threading

queued_request = queue.Queue()

check_infos_thread = threading.Thread(target=check_infos, args=(user_id, queued_request))

check_infos_thread.start()

final_result = queued_request.get()

BoCyrill answered 2019-11-10T12:59:01Z

2 votes

POC:

import random

import threading

class myThread( threading.Thread ):

def __init__( self, arr ):

threading.Thread.__init__( self )

self.arr = arr

self.ret = None

def run( self ):

self.myJob( self.arr )

def join( self ):

threading.Thread.join( self )

return self.ret

def myJob( self, arr ):

self.ret = sorted( self.arr )

return

#Call the main method if run from the command line.

if __name__ == '__main__':

N = 100

arr = [ random.randint( 0, 100 ) for x in range( N ) ]

th = myThread( arr )

th.start( )

sortedArr = th.join( )

print "arr2: ", sortedArr

husanu answered 2019-11-10T12:59:25Z

1 votes

好吧,在Python线程模块中,有一些与锁关联的条件对象。 一种方法acquire()将返回从基础方法返回的任何值。 有关更多信息:Python条件对象

Ben Hayden answered 2019-11-10T12:59:51Z

1 votes

基于jcomeau_ictx的建议。 我遇到的最简单的一个。 此处的要求是从服务器上运行的三个不同进程获取退出状态状态,并在三个进程均成功时触发另一个脚本。 这似乎工作正常

class myThread(threading.Thread):

def __init__(self,threadID,pipePath,resDict):

threading.Thread.__init__(self)

self.threadID=threadID

self.pipePath=pipePath

self.resDict=resDict

def run(self):

print "Starting thread %s " % (self.threadID)

if not os.path.exists(self.pipePath):

os.mkfifo(self.pipePath)

pipe_fd = os.open(self.pipePath, os.O_RDWR | os.O_NONBLOCK )

with os.fdopen(pipe_fd) as pipe:

while True:

try:

message = pipe.read()

if message:

print "Received: '%s'" % message

self.resDict['success']=message

break

except:

pass

tResSer={'success':'0'}

tResWeb={'success':'0'}

tResUisvc={'success':'0'}

threads = []

pipePathSer='/tmp/path1'

pipePathWeb='/tmp/path2'

pipePathUisvc='/tmp/path3'

th1=myThread(1,pipePathSer,tResSer)

th2=myThread(2,pipePathWeb,tResWeb)

th3=myThread(3,pipePathUisvc,tResUisvc)

th1.start()

th2.start()

th3.start()

threads.append(th1)

threads.append(th2)

threads.append(th3)

for t in threads:

print t.join()

print "Res: tResSer %s tResWeb %s tResUisvc %s" % (tResSer,tResWeb,tResUisvc)

# The above statement prints updated values which can then be further processed

f-z-N answered 2019-11-10T13:00:17Z

0 votes

以下包装函数将包装现有函数并返回一个对象,该对象既指向线程(因此您可以在其上调用threading.Thread、join()等),也可以访问/查看其最终返回值。

def threadwrap(func,args,kwargs):

class res(object): result=None

def inner(*args,**kwargs):

res.result=func(*args,**kwargs)

import threading

t = threading.Thread(target=inner,args=args,kwargs=kwargs)

res.thread=t

return res

def myFun(v,debug=False):

import time

if debug: print "Debug mode ON"

time.sleep(5)

return v*2

x=threadwrap(myFun,[11],{"debug":True})

x.thread.start()

x.thread.join()

print x.result

看起来还可以,并且threading.Thread类似乎可以通过这种功能轻松扩展(*),所以我想知道为什么它还不存在。 上述方法是否有缺陷?

(*)请注意,husanu对这个问题的回答恰好做到了,将threading.Thread子类化,得到join()给出返回值的版本。

Andz answered 2019-11-10T13:01:01Z

0 votes

对于简单的程序,以上答案对我来说似乎有点过头了。 我会采纳这种可变方法:

class RetVal:

def __init__(self):

self.result = None

def threadfunc(retVal):

retVal.result = "your return value"

retVal = RetVal()

thread = Thread(target = threadfunc, args = (retVal))

thread.start()

thread.join()

print(retVal.result)

TheTrowser answered 2019-11-10T13:01:26Z

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现火车票查询_python实现12306火车票查询器

12306火车票购票软件大家都用过,怎么用Python写一个命令行的火车票查看器,要求在命令行敲一行命令来获得你想要的火车票信息,下面通过本文学习吧。Python火车票查询器接口设置先给这个小应用起个名字吧,既然及查询票务信息&#x…

python字符串用法_笔记:python字符串的使用

Python 没有表示单个字符的字符类型,只有字符串类型str。字符串是用单引号或双引号括起来的一系列字符。单引号表示的字符串中可以包含双引号字符,但不能直接包含单引号字符(否则无法知道字符串的开始和结尾分别在哪里)。同样,双引号表示的字…

new出来的对象怎么回收_JVM的内存模型及垃圾回收算法

1、什么是jvm:虚拟出来的计算机,是jre的一部分,使用jvm是为了支持与操作系统无关,实现跨平台,jvm内部体系结构主要分为三个部分:类加载器子系统,运行时数据区和执行引擎。2、jvm内存区域运行时数…

条令考试小程序辅助器_可以自己编题的答题软件,自定义题库考试出题工具,微信答题小程序...

自制题库自己编题的答题小程序要如何制作?今天给大家介绍下可以自己编题的答题软件,自制题库软件在微信小程序里自己出题,然后给别人来答题。每个人都可以通过这个小程序系统出考题,然后给到别人答题(自己、同事、学生…

python36 mysql_python-day36(初识MySQL数据库)

一. MySQL 介绍数据库分类:1. 关系型数据库(RDBMS)Oracle数据库MySQLl数据库MariaDB数据库SQL Server数据库Access数据库其他不常用关系型数据库: DB2,PostgreSQL,Informix,Sybase2. 非关系型数据库(Nosql)NOSQL>>>>> Not Olnly SQL键值(Key-Value)存储数据库me…

python解二元二次方程_寻找两个椭圆的交点(Python)

首先,您应该能够在一个方向上重新缩放椭圆。为此,需要将椭圆的系数计算为二次曲线,重新缩放,然后恢复椭圆的新几何参数:中心、轴、角度。然后你的问题减少到找到从椭圆到原点的距离。要解决最后一个问题,你…

mysql jion 三张_mysql三张表 left join

1.建表和数据学生表DROP TABLE IF EXISTS student;CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(30) DEFAULT NULL,classid varchar(30) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8;-- -------------------…

编写有效用例电子版_软件测试人员必须编写代码吗?

相信每一个刚入门软件测试的小伙伴都会琢磨一个问题:软件测试人员,要不要写代码?其实这个问题同样困扰着已经在测试行业闯荡了几年的测试小司机们。那今天,我就来给大家分析一下~01各种软件测试角色一般而言软件测试大体可以分为两…

mysql sqlserver firstrow=2_将CSV文件导入SQLServer

基于SQL Server的CSV导入1)CSV文件数据可能具有,(逗号)中间(Ex:Description),那么如何使导入处理这些数据?解如果你用,(逗号)作为分隔符,就无法区分数据中的逗号作为字段终止符和逗号。我会用不同的FIELDTERMINATOR喜欢||..代码看…

bert 中文 代码 谷歌_ELECTRA中文预训练模型开源,110个参数,性能媲美BERT

感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7050/ 在去年11月份,NLP大神Manning联合谷歌做的ELECTRA一经发布,迅速火爆整个NLP圈,其中ELECTRA-small模型参数量仅为 BERT-base模型的1/10,性能却依然能与BERT、RoBERTa等…

python开发系统架构设计师_系统架构设计师在线题库

该课程包含了三大重磅性课程,学员 可以分三个阶段进行学习,一步一个脚印深入巩固SpringBoot知识体系栈、消息中间件RabbitMQ以及分布式锁的实现方式1、SpringBoot实战知识体系~从菜鸟到小牛 本课程可以让学员一步一个脚印学习当前微服务SpringBoot项目开…

监督学习和无监督学习_机器学习的要素是什么? 有监督学习和无监督学习两大类...

如前所述,机器学习是AI的一个子集,通常分为两大类:有监督学习和无监督学习。监督学习教学AI系统的常用技术是通过使用大量带标签的示例来训练它们。这些机器学习系统被馈入大量数据,这些数据已被注释以突出显示感兴趣的功能。这些…

如何用python计算levenshteindistance_Levenshtein计算相似度距离

使用Levenshtein计算相似度距离,装下模块,调用下函数就好。拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦。Levenshtein.distance(str1,str2)…

pythoncsv文件的操作_python操作CSV文件

概念:CSV是逗号分隔值或者字符分割值,其文件以纯文本形式存储表格数据。CSV文件可以用文本文件或者转换成EXCEL(直接用EXCEL也可以,但是可能会有一些问题)打开。因此更适合通过CSV文件进行程序之间转移表格数据。应用场景:需要进行…

欧姆龙变频器MX2参数_第442期丨【源程序】基于三菱西门子欧姆龙松下PLC实现喷水池控制系统;欧姆龙PLC编程软件更新步骤...

论坛周刊1 Dec 2019本期论坛周刊精彩内容:1、【源程序】基于三菱\西门子\欧姆龙\松下PLC实现喷水池控制系统2、欧姆龙PLC编程软件更新步骤3、RSLinx Classic EntherNet/IP配置4、这个运动控制算厉害么5、施耐德、ABB、西门子接连登门拜访往期精选▼第441期丨施耐德电…

linux两台服务器 同一个地址_【网工玩Linux】搭建开源多运营商(ISP)链路负载均衡器...

今天,主要想讲一下如何利用Linux内核功能,搭建与市面上十几万的商用产品(F5、RADWARE等)功能相同的多互联网线路负载均衡设备。负载均衡,相信各位是了解的。主要包括两大类,一类是应用负载均衡,…

hive 和mysql配置_Hive学习和配置Mysql

1.Hive简介 起源自facebook由Jeff Hammerbacher领导的团队 构建在Hadoop上的数据仓库框架 设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据 2008年facebook把hive项目贡献给Apache Hive的组件与体系架构 用户接口:shell, thrift, web等…

python拦截修改数据包_会Python?那么你一定要试一试mitmproxy

mitmproxy 是一款工具,也可以说是 python 的一个包,使用这个工具可以在命令行上进行抓包(现在也可以在web页面上查看上抓的数据包了),还可以对所抓到的包进行脚本处理,非常有用。和 fiddler 或charles 等接口抓包工具相比&#xf…

java sha1_java使用SHA1加密算法详解

java使用SHA1加密算法程序源码://下面四个import放在类名前面 包名后面import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;public static String getSha1(S…