python多线程如何统计运行次数 python怎么多线程

169 篇文章 1 订阅
156 篇文章 0 订阅

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

Python 多线程之使用方法

Python 提供多线程编程的模块有以下几个:

– _thread

– threading

– Queue

– multiprocessing

下面一一介绍:

1. _thread 模块提供了低级别的基本功能来支持多线程功能,提供简单的锁来确保同步,推荐使用 threading 模块。

2. threading 模块对 _thread 进行了封装,提供了更高级别,功能更强,更易于使用的线程管理的功能,对线程的支持更为完善,绝大多数情况下,只需要使用 threading 这个高级模块就够了。

相关推荐:《Python教程》

使用 threading 进行多线程操作:

方法一:是创建 threading.Thread 实例,调用其 start() 方法。

import time
import threading
def task_thread(counter):
print(f'线程名称:{threading.current_thread().name} 参数:{counter} 开始时间:{time.strftime("%Y-%m-%d
%H:%M:%S")}')
num = counter
while num:
time.sleep(3)
num -= 1
print(f'线程名称:{threading.current_thread().name} 参数:{counter} 结束时间:{time.strftime("%Y-%m-%d
%H:%M:%S")}')
if __name__ == '__main__':
print(f'主线程开始时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
#初始化3个线程,传递不同的参数
t1 = threading.Thread(target=task_thread, args=(3,))
t2 = threading.Thread(target=task_thread, args=(2,))
t3 = threading.Thread(target=task_thread, args=(1,))
#开启三个线程
t1.start()
t2.start()
t3.start()
#等待运行结束
t1.join()
t2.join()
t3.join()

print(f'主线程结束时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

运行结果如下所示:

主线程开始时间:2018-07-06 23:03:46

线程名称:Thread-1 参数:3 开始时间:2018-07-06 23:03:46

线程名称:Thread-2 参数:2 开始时间:2018-07-06 23:03:46

线程名称:Thread-3 参数:1 开始时间:2018-07-06 23:03:46

线程名称:Thread-3 参数:1 结束时间:2018-07-06 23:03:49

线程名称:Thread-2 参数:2 结束时间:2018-07-06 23:03:52

线程名称:Thread-1 参数:3 结束时间:2018-07-06 23:03:55

主线程结束时间:2018-07-06 23:03:55

方法二:继承 Thread 类,在子类中重写 run() 和 init() 方法。
 

import time
import threading
class MyThread(threading.Thread):
def __init__(self, counter):
super().__init__()
self.counter = counter
def run(self):
print(
f'线程名称:{threading.current_thread().name} 参数:{self.counter} 开始时间:{time.strftime
("%Y-%m-%d %H:%M:%S")}'
)
counter = self.counter
while counter:
time.sleep(3)
counter -= 1
print(
f'线程名称:{threading.current_thread().name} 参数:{self.counter} 结束时间:{time.strftime
("%Y-%m-%d %H:%M:%S")}'
)
if __name__ == "__main__":
print(f'主线程开始时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
# 初始化3个线程,传递不同的参数
t1 = MyThread(3)
t2 = MyThread(2)
t3 = MyThread(1)
# 开启三个线程
t1.start()
t2.start()
t3.start()
# 等待运行结束
t1.join()
t2.join()
t3.join()
print(f'主线程结束时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

运行结果如下,与方法一的运行结果一致。

主线程开始时间:2018-07-06 23:34:16

线程名称:Thread-1 参数:3 开始时间:2018-07-06 23:34:16

线程名称:Thread-2 参数:2 开始时间:2018-07-06 23:34:16

线程名称:Thread-3 参数:1 开始时间:2018-07-06 23:34:16

线程名称:Thread-3 参数:1 结束时间:2018-07-06 23:34:19

线程名称:Thread-2 参数:2 结束时间:2018-07-06 23:34:22

线程名称:Thread-1 参数:3 结束时间:2018-07-06 23:34:25

主线程结束时间:2018-07-06 23:34:25

如果继承 Thread 类,想调用外部传入函数,代码如下所示:

import time
import threading
def task_thread(counter):
print(f'线程名称:{threading.current_thread().name} 参数:{counter} 开始时间:{time.strftime("%Y-%m-%d
%H:%M:%S")}')
num = counter
while num:
time.sleep(3)
num -= 1
print(f'线程名称:{threading.current_thread().name} 参数:{counter} 结束时间:{time.strftime("%Y-%m-%d
%H:%M:%S")}')
class MyThread(threading.Thread):
def __init__(self, target, args):
super().__init__()
self.target = target
self.args = args
def run(self):
self.target(*self.args)
if __name__ == "__main__":
print(f'主线程开始时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')
# 初始化3个线程,传递不同的参数
t1 = MyThread(target=task_thread,args=(3,))
t2 = MyThread(target=task_thread,args=(2,))
t3 = MyThread(target=task_thread,args=(1,))
# 开启三个线程
t1.start()
t2.start()
t3.start()
# 等待运行结束
t1.join()
t2.join()
t3.join()
print(f'主线程结束时间:{time.strftime("%Y-%m-%d %H:%M:%S")}')

这样就和方法一是相通的,实例化自定义的线程类,运行结果不变。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值