题目:

# 编写一个python程序,创建两个子线程,分别到下面的网址获取文本内容
# http://mirrors.163.com/centos/6/isos/x86_64/README.txt
# http://mirrors.163.com/centos/7/isos/x86_64/0_README.txt
# 主线程等待这个两个子线程获取到信息后,将其内容依次合并后存入名为 readme89.TXT 的文件中

答案1:通过返回值实现

1、创建线程类,重构线程基类初始化函数

from threading import Thread

# 创建一个线程类
class MyThread(Thread):
# 重定义初始化
def __init__(self,func,args=()):
super(MyThread, self).__init__()
self.func = func
self.args = args # 运行函数(线程)
def run(self):
self.rusult = self.func(*self.args)

# 获得返回值
def get_result(self):
Thread.join(self) # 等待线程执行完毕
try:
return self.rusult
except Exception:
return None

2、创建子线程实现调用返回值的操作

import requests,traceback
from pythondevelop.case_1109ReturnValue import MyThread # 创建两个子线程用于获取网页内容
def thread1():
r = requests.get('http://mirrors.163.com/centos/6/isos/x86_64/README.txt') return r def thread2():
r = requests.get('http://mirrors.163.com/centos/6/isos/x86_64/0_README.txt') return r # 主程序等待子线程获取后合并内容到readme89.TXT
try:
th1= MyThread(thread1)
th2= MyThread(thread2)
th1.start()
th2.start()
th1result = th1.get_result()
th2result = th2.get_result()
if th1result != None and th2result != None and th1result.status_code == 200 and th2result.status_code == :
with open('readme89.txt','w+') as f:
f.write(th1result.text)
f.write('---------------------------------------this is line!!-------------------------------------')
f.write(th2result.text)
f.close()
except:
print(traceback.format_exc()) 答案2:通过将返回值放在预先定义的列表中,及对线程锁的应用
# coding=utf8
import requests,threading urls = [
'http://mirrors.163.com/centos/6/isos/x86_64/README.txt',
'http://mirrors.163.com/centos/6/isos/x86_64/0_README.txt'] # 对应urls 依次存储网页文件内容, 先创建同样个数的元素占位
fileContentList = [None for one in urls] # 锁对象,用来控制访问 fileContentList
lock = threading.Lock() def thread_entry(idx,url):
print('thread #%s start' % idx)
r = requests.get(url) # 注意上面的代码不应该放在获取锁的代码中
lock.acquire()
# 注意 r.text的类型是unicode,可以在文档中查到
fileContentList[idx] = r.text
lock.release() print('thread #%s end' % idx) if __name__ == '__main__':
print('main thread start.') threadpool = [] for idx,url in enumerate(urls): # enumerate()用于遍历数据对象(如列表)组合为一个索引序列,同时列出下标和数据
t = threading.Thread(target=thread_entry,args=(idx,url))
t.start() threadpool.append(t) # 等所有 线程结束
for t in threadpool:
t.join() # 所有线程结束后,所有内容都获取到了,合并内容 mergeTxt = '\n\n----------------------\n\n'.join(fileContentList)
print(mergeTxt) with open('readme89.txt','w',encoding='utf8') as f:
f.write(mergeTxt) print('main thread end.')

python多线程返回值的实现与处理的更多相关文章

  1. shell如何向python传递参数,shell如何接受python的返回值

    1.shell如何向python传递参数 shell脚本 python $sendmailCommandPath $optDate python脚本 lastDateFormat = sys.argv ...

  2. python函数返回值

    2016-08-09  15:01:38 python函数返回值使用return语句,可以返回任意类型的数.如果return语句执行,它之后的所有语句都不再执行. def func(x,y): pri ...

  3. JAVA多线程解惑之多线程返回值

    如果有人问题你,多线程可以有返回值吗?你怎么回答? 看下面例子,我定义了一个类实现了Callable 接口 public class MyCallable implements Callable< ...

  4. Python 函数返回值

    本章详细介绍 返回值: 0x 00 返回值简介 0x 01 指定返回值与隐含返回值 0x 02 return 语句位置与多条 return 语句 0x 03 返回值类型 0x 04 函数嵌套 0x 0 ...

  5. Python丢弃返回值

    函数多个返回值 python的函数支持返回多个值.返回多个值时,默认以tuple的方式返回. 例如,下面两个函数的定义是完全等价的. def f(): return 1,2 def f(): retu ...

  6. python 函数返回值笔记

    今天学习python时候学习到闭包和柯里化 感觉看概念时候不好理解,自己写下大概就明白点了 柯里化如下 定义一个加法函数 def add(x, y): return x + y 这是没有柯里化之前的函 ...

  7. python的返回值

    1.返回值的作用 函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值.函数返回的值被称为返回值.在函数中,可使用return语句将值返回到调用函数的代码行.返回值让你能够将程序的大 ...

  8. Python 函数返回值、作用域

    函数返回值 多条return语句: def guess(x): if x > 3: return "> 3" else: return "<= 3&qu ...

  9. day09 python函数 返回值 参数

    day09 python   一.函数     1.函数         函数是对功能的封装         语法:         定义函数:             def 函数名(形参):    ...

随机推荐

  1. 硬件知识整理part3--电阻在单片机系统中的应用

    邦有道,如矢:邦无道,如矢.  --孔子 电阻在电路中主要功能是限流和分压等等.在单片机系统中自然也是. 电阻作为限流应该是最常用的应用之一,对于单片机外围设计来说,电阻的应用非常重要,在很多时候,我 ...

  2. cf1067b

    题意简述:判断所给图是不是一个k递归图 这是一个2递归图 题解:仔细观察发现中心点一定是直径的中点,因此找到直径中点之后进行bfs判断即可,这里注意判断递归层次太大也不符合 const int max ...

  3. java文件分割及合并

    分割设置好分割数量,根据源文件大小来把数据散到子文件中代码如下; package word; import java.io.File; import java.io.FileInputStream; ...

  4. 虚拟机ifconfig 没有IP地址显示

    虚拟机centos 找不到IP地址 -----------------下图解决后有ip地址----------------------- 1.  查看网络IP和网关     >>1.  查 ...

  5. P2710 数列[fhq treap]

    调了一辈子的fhq treap- 如果不会最大子段和 如果不会fhq treap 7个操作- 其中三个查询 单点查询其实可以和区间查询写成一个( fhq treap 的修改操作大概就是 \(split ...

  6. mac 中 端口占用

    1.   sudo lsof -i :5001 2.   sudo kill -9 PID

  7. 多线程模式下高并发的环境中唯一确保单例模式---DLC双端锁

    DLC双端锁,CAS,ABA问题 一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会 ...

  8. gulp常用插件之gulp-inject使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-inject这个插件的作用与wiredep类似,不同的是可以自己任意指定需要插入文件的列表.它同样是利用注释来寻找插入的位置.获取源文件 ...

  9. 百度地图根据list经纬度算每个点到剩余点的平均距离、最远距离和最近距离

    一.使用步骤 说明:给你一大串坐标list.计算每个点到其他所有点的最近最远平均距离. 1.打开百度地图api在线demo(随便一个都行) 2.替换<script></script& ...

  10. kuangbin专题专题十一 网络流 Minimum Cost POJ - 2516

    题目链接:https://vjudge.net/problem/POJ-2516 思路:对于每种商品跑最小费用最大流,如果所有商品和人一起建图跑,O(v^2*m)数量级太大,会超时. 把店里的商品拆点 ...