python 实现多线程的三种方法总结
作者:淋巴不想动 发布时间:2022-10-17 07:09:11
标签:python,多线程
1._thread.start_new_thread(了解)
import threading
import time
import _thread
def job():
print("这是一个需要执行的任务。。。。。")
print("当前线程的个数:", threading.active_count() )
print("当前线程的信息:", threading.current_thread())
time.sleep(100)
if __name__ == '__main__':
# 创建多线程时, 需要制定该线程执行的任务
_thread.start_new_thread(job, ())
_thread.start_new_thread(job, ())
job()
2.threading.Thread
import threading
import time
def job():
print("这是一个需要执行的任务。。。。。")
print("当前线程的个数:", threading.active_count() )
time.sleep(1)
print("当前线程的信息:", threading.current_thread())
if __name__ == '__main__':
# 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
t1 = threading.Thread(target=job,name='job1')
t2 = threading.Thread(target=job,name='job2')
t1.start()
t2.start()
print(threading.active_count())
print("程序执行结束.....")
输出:
这是一个需要执行的任务。。。。。
当前线程的个数: 3
这是一个需要执行的任务。。。。。
3
程序执行结束.....
当前线程的个数: 3
当前线程的信息: <Thread(job1, started 140416648140544)>
当前线程的信息: <Thread(job2, started 140416639747840)>
出现的问题: 主线程执行结束, 但是子线程还在运行。
join()方法可以等待所有的子线程执行结束之后, 再执行主线程。
import threading
import time
def job():
print("这是一个需要执行的任务。。。。。")
print("当前线程的个数:", threading.active_count() )
print("当前线程的信息:", threading.current_thread())
time.sleep(1)
if __name__ == '__main__':
# 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
t1 = threading.Thread(target=job,name='job1')
t2 = threading.Thread(target=job,name='job2')
t1.start()
t2.start()
print(threading.active_count())
# 出现的问题: 主线程执行结束, 但是子线程还在运行。
# 等待所有的子线程执行结束之后, 再执行主线程
t1.join()
t2.join()
print("程序执行结束.....")
之前写过一个简单爬虫的实验,现在希望获取十个ip的城市和国家
-不使用多线程
import time
from urllib.request import urlopen
# 记录时间的装饰器
def timeit(f):
def wrapper(*args, **kwargs):
start_time = time.time()
res = f(*args, **kwargs)
end_time = time.time()
print("%s函数运行时间:%.2f" % (f.__name__, end_time - start_time))
return res
return wrapper
def get_addr(ip):
url = "http://ip-api.com/json/%s" % (ip)
urlObj = urlopen(url)
# 服务端返回的页面信息, 此处为字符串类型
pageContent = urlObj.read().decode('utf-8')
# 2. 处理Json数据
import json
# 解码: 将json数据格式解码为python可以识别的对象;
dict_data = json.loads(pageContent)
print("""
%s
所在城市: %s
所在国家: %s
""" % (ip, dict_data['city'], dict_data['country']))
@timeit
def main():
ips = ['12.13.14.%s' % (i + 1) for i in range(10)]
for ip in ips:
get_addr(ip)
if __name__ == '__main__':
main()
时间需要138.91秒。
-使用多线程
import threading
import time
from urllib.request import urlopen
def timeit(f):
def wrapper(*args, **kwargs):
start_time = time.time()
res = f(*args, **kwargs)
end_time = time.time()
print("%s函数运行时间:%.2f" % (f.__name__, end_time - start_time))
return res
return wrapper
def get_addr(ip):
url = "http://ip-api.com/json/%s" % (ip)
urlObj = urlopen(url)
# 服务端返回的页面信息, 此处为字符串类型
pageContent = urlObj.read().decode('utf-8')
# 2. 处理Json数据
import json
# 解码: 将json数据格式解码为python可以识别的对象;
dict_data = json.loads(pageContent)
print("""
%s
所在城市: %s
所在国家: %s
""" % (ip, dict_data['city'], dict_data['country']))
@timeit
def main():
ips = ['12.13.14.%s' % (i + 1) for i in range(10)]
threads = []
for ip in ips:
# 实例化10个对象,target=目标函数名,args=目标函数参数(元组格式)
t = threading.Thread(target=get_addr, args=(ip, ))
threads.append(t)
t.start()
# 等待所有子线程结束再运行主线程
[thread.join() for thread in threads]
if __name__ == '__main__':
main()
3.重写run方法
重写run方法, 实现多线程, 因为start方法执行时, 调用的是run方法;run方法里面编写的内容就是你要执行的任务;
import threading
import time
# 重写一个类,继承于threading.Thread
class MyThread(threading.Thread):
def __init__(self, jobName):
super(MyThread, self).__init__()
self.jobName = jobName
# 重写run方法, 实现多线程, 因为start方法执行时, 调用的是run方法;
# run方法里面编写的内容就是你要执行的任务;
def run(self):
print("这是一个需要执行的任务%s。。。。。" %(self.jobName))
print("当前线程的个数:", threading.active_count() )
time.sleep(1)
print("当前线程的信息:", threading.current_thread())
if __name__ == '__main__':
t1 = MyThread("name1")
t2 = MyThread("name2")
t1.start()
t2.start()
t1.join()
t2.join()
print("程序执行结束.....")
重写run方法实现刚才爬虫多线程案例
import threading
import time
from urllib.request import urlopen
def timeit(f):
def wrapper(*args, **kwargs):
start_time = time.time()
res = f(*args, **kwargs)
end_time = time.time()
print("%s函数运行时间:%.2f" % (f.__name__, end_time - start_time))
return res
return wrapper
class MyThread(threading.Thread):
def __init__(self, ip):
super(MyThread, self).__init__()
self.ip = ip
def run(self):
url = "http://ip-api.com/json/%s" % (self.ip)
urlObj = urlopen(url)
# 服务端返回的页面信息, 此处为字符串类型
pageContent = urlObj.read().decode('utf-8')
# 2. 处理Json数据
import json
# 解码: 将json数据格式解码为python可以识别的对象;
dict_data = json.loads(pageContent)
print("""
%s
所在城市: %s
所在国家: %s
""" % (self.ip, dict_data['city'], dict_data['country']))
@timeit
def main():
ips = ['12.13.14.%s' % (i + 1) for i in range(10)]
threads = []
for ip in ips:
# 实例化自己重写的类
t = MyThread(ip)
threads.append(t)
t.start()
[thread.join() for thread in threads]
if __name__ == '__main__':
main()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/weixin_43067754/article/details/86763905


猜你喜欢
- 一个asp读取数据库中数据到数组的类,仅供参考!DbPath = "test.mdb"’数据库位置&
- 有这样一个要求,它要创建一个SQL Server查询,其中包括基于事件时刻的累计值。典型的例子就是一个银行账户,因为你每一次都是在不同的时间
- 思路简单的生成和读取 CSVCSV 文件格式使用 csv 库Python with CSV先有个很朴素的生成和解析的方法。生成:data =
- 参考:1.Basemap绘制中国地图2.Basemap生成的图中绘制轨迹使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制impor
- 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] <script&
- 实例: <?php $conn1 = mysql_connect("127.0.0.1", "root&
- 题目:解法一:比较元素是否相等思路说明:这种应该是普通人最先想到的解法,先获取到数组之后进行有小到大排序,然后初始化一个min=0(代表新数
- 目录1.字典字典的相关操作获取字典的长度2.集合1.字典字典是python中的一种数据结构。它的内容由**键-值(key-value)**的
- 在用pyinstaller打包后不想要后面的终端命令框,但是打包时加了-w或者--noconsole命令后会导致cmd程序不能运行从而出错。
- 最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。
- 前言今天在 git.oschina 的首页上看到他们推出演示平台,其中,Python 的演示平台支持 WSGI 接口的应用。虽然,这个演示平
- 1、为什么淘宝的手机频道页面,竟然会有笔记本、数码相机、随身听,甚至是游戏之类的栏目,而且还有一个“数码·生活”栏目是包括以上这些设备的综合
- 变量插入字符串的方法Python中的format()函数是一种将变量插入字符串的方法,能够使字符串更易于阅读和理解。它支持许多不同的用法,以
- 笔者remove TensorFlow总共四次。 reinstall anaconda 三次。安装技巧可以根据这个博主的文章进行安装。htt
- 一、介绍Django特点:具有完整的封装,开发者可以高效率的开发项目,Django将大部分的功能进行了封装,开发者只需要调用即可,如此,大大
- 所有文件都包含在各个不同的目录下,不过Python也能轻松处理。os模块有许多方法能帮你创建,删除和更改目录。mkdir()方法可以使用os
- 本文实例讲述了python多线程高级锁condition简单用法。分享给大家供大家参考,具体如下:多线程编程中如果使用Condition对象
- 大概在2004年初的时候,我第一次买了一本很厚的书,名字或许叫《Dreamweaver MX从入门到精通》,很认真看着书并实践操作大约三分之
- 1 配置环境setting.json·是设置语言环境,launch.json是设置执行环境来执行代码,tasks.js
- select count(*) as lot from OA_sample_check where left(ecnNO, LOCATE(&