Python技巧之四种多线程应用分享
作者:Python 发布时间:2021-12-04 12:11:57
在Python中,多线程是实现并发的一种方式。多线程可以让程序在同一时间内进行多个任务,从而提高程序的效率和执行速度。
本文将介绍Python中多线程的所有方式,包括使用threading模块、使用concurrent.futures模块、使用multiprocessing模块以及使用asyncio模块。
1.使用threading模块
Python中的threading模块提供了多线程编程的基本支持。使用该模块可以创建和管理线程,从而实现并发执行。下面是使用threading模块实现多线程的示例代码:
import threading
def worker():
print('Worker thread started')
# do some work here
print('Worker thread finished')
if __name__ == '__main__':
print('Main thread started')
# create a new thread
t = threading.Thread(target=worker)
# start the new thread
t.start()
print('Main thread finished')
在上面的代码中,我们首先定义了一个worker函数,该函数会在一个新的线程中执行。
然后,在主线程中创建了一个新的线程t,并将worker函数作为该线程的目标。
最后,通过调用start方法来启动新线程。运行上面的代码,输出结果如下:
Main thread started
Worker thread started
Main thread finished
Worker thread finished
从上面的输出结果可以看出,程序先执行了主线程中的代码,然后创建了一个新的线程,并在新线程中执行worker函数。
主线程和新线程是并行执行的,因此程序的执行速度得到了提高。
2.使用concurrent.futures模块
concurrent.futures模块是Python 3中的新模块,它提供了线程池和进程池的实现。使用该模块可以更方便地实现并行执行。
下面是使用concurrent.futures模块实现多线程的示例代码:
import concurrent.futures
def worker():
print('Worker thread started')
# do some work here
print('Worker thread finished')
if __name__ == '__main__':
print('Main thread started')
# create a thread pool
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
# submit worker function to the pool
future = executor.submit(worker)
print('Main thread finished')
在上面的代码中,我们首先定义了一个worker函数,该函数会在一个新的线程中执行。
然后,在主线程中创建了一个线程池executor,并设置最大线程数为2。接着,通过调用submit方法将worker函数提交给线程池。
最后,我们输出了一条信息,表示主线程已经执行完毕。运行上面的代码,输出结果如下:
Main thread started
Main thread finished
Worker thread started
Worker thread finished
从上面的输出结果可以看出,程序先执行了主线程中的代码,然后通过线程池执行了worker函数。线程池会自动管理线程的创建和销毁,从而使程序更加高效。
3.使用multiprocessing模块
Python中的multiprocessing模块提供了多进程编程的支持。使用该模块可以在不同的进程中执行任务,从而实现并发执行。
下面是使用multiprocessing模块实现多线程的示例代码:
import multiprocessing
def worker():
print('Worker process started')
# do some work here
print('Worker process finished')
if __name__ == '__main__':
print('Main process started')
# create a new process
p = multiprocessing.Process(target=worker)
# start the new process
p.start()
print('Main process finished')
在上面的代码中,我们首先定义了一个worker函数,该函数会在一个新的进程中执行。然后,在主进程中创建了一个新的进程p,并将worker函数作为该进程的目标。
最后,通过调用start方法来启动新进程。运行上面的代码,输出结果如下:
Main process started
Main process finished
Worker process started
Worker process finished
从上面的输出结果可以看出,程序先执行了主进程中的代码,然后创建了一个新的进程,并在新进程中执行worker函数。
主进程和新进程是并行执行的,因此程序的执行速度得到了提高。
4.使用asyncio模块
Python中的asyncio模块提供了异步编程的支持。使用该模块可以实现协程,从而在单线程中实现并发执行。
下面是使用asyncio模块实现多线程的示例代码:
import asyncio
async def worker():
print('Worker task started')
# do some work here
print('Worker task finished')
if __name__ == '__main__':
print('Main task started')
# create a new event loop
loop = asyncio.get_event_loop()
# run the worker coroutine
loop.run_until_complete(worker())
# close the event loop
loop.close()
print('Main task finished')
在上面的代码中,我们首先定义了一个异步函数worker,该函数会在一个协程中执行。
然后,在主任务中创建了一个新的事件循环loop,并通过调用run_until_complete方法来运行worker协程。
最后,我们关闭了事件循环。运行上面的代码,输出结果如下:
Main task started
Worker task started
Worker task finished
Main task finished
从上面的输出结果可以看出,程序先执行了主任务中的代码,然后通过事件循环执行了worker协程。
协程是在单线程中执行的,因此程序的执行速度得到了提高。
5.总结
本文介绍了Python中多线程的所有方式,包括使用threading模块、使用concurrent.futures模块、使用multiprocessing模块以及使用asyncio模块。
不同的方式适用于不同的场景,可以根据需要选择最合适的方式。
多线程编程可以提高程序的效率和执行速度,但需要注意线程安全和锁的使用。
来源:https://mp.weixin.qq.com/s/kCkKFRQoumP8PZ5zH3sqeA


猜你喜欢
- 简介Closure所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭
- 众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己
- Python中滑动平均算法(Moving Average)方案:#!/usr/bin/env python# -*- coding: utf
- 这问题在网络相信已经有不少人问到,最近再次被牵起讨论,籍此记录一下个人的理解,border:none;与border:0;的区别体现有两点:
- CSS换肤技术一直是一个比较热门的话题,通过给HTML文档不同的CSS样式应用,实现完全不同或风格迥异的页面效果。这样的技术一直为大家所津津
- 如下所示:import serialimport timet = serial.Serial('com6', 115200)
- 异步操作数据的方式有两种常见的方式:XMLHttpRequest 和 iframe. 孰优孰劣在此我们不争论,只是想举一个例子说明在获取网片
- 前言在实际工作中,我们很少会遇到一次性需要向页面中插入大量数据的情况,但是为了丰富我们的知识体系,我们有必要了解并清楚当遇到大量数据时,如何
- 概述最近在一家公司实习,入职第一个大一点的需求是将公司开发的两个winstore app的排名信息进行可视化。大概挑选了下,排除了Flask
- id(object)功能:返回的是对象的“身份证号”,唯一且不变,但在不重合的生命周期里,可能会出现相同的id值。此处所说的对象应该特指复合
- Dim iSet conn=Server.CreateObject("ADODB.Connecti
- 我这里只讲几点有关于MySQL数据库安装后遇到的个别问题 我之前安装过MYSQL好像不用手动启动服务,具体也忘记了,但我上回给公司安装的那个
- Hedger Wang 在国内 blog 上得到的方法:使用 try … finally 结构来使对象最终为 null ,以阻止内存泄露。其
- 微信这个东西估计宅男没几个不熟悉的吧,微信经过这么两年多的发展终于向开放平台跨出了友好的一步。蛋疼的以为微信会出一个详细的api等接口,兴奋
- 首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Un
- ?? 罪魁祸首一个常见的场景是在表格行内以el-popover的形式对行内信息进行一些业务操作。在表格分页10条、20条的情况下页面运行良好
- /** * @Purpose: Mysql数据库访问类 * @Package: * @Author: lisen@sellingclub.c
- Runtime包GOMAXPROCS()用来设置可以并行计算的CPU核数最大值,并返回之前的值,具体使用方法上一篇有些,这里不再赘述Gosc
- 我就废话不多说了,大家还是直接看代码吧!import tensorflow as tfimport numpy as npinput = t
- 1.安装 Selenium 模块Selenium支持很多浏览器,我选择的是Firefox浏览器。安装方法:①打开cmd;②输入命令 pip