python系列-并发
多进程
- python的os模块提供了
fork
函数,但不支持跨平台 - multiprocessing模块的
Process
类创建子进程支持跨平台,并且提供了更高级的封装 - 多进程共享数据可以用管道,套接字等
- multiprocessing提供了一个
Queue
类,基于管道和锁机制提供了多个进程共享的队列
from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep
def download_task(filename):
print("启动下载,进程号[%d]"%getpid())
print("开始下载%s..."%filename)
time_to_download = randint(5,10)
sleep(time_to_download)
print("%s下载完成,耗费%d秒"%filename,time_to_download)
def main():
start = time()
p1 = Process(target=download_task, args=("python从入门到放弃.pdf",))
p1.start()
p2 = Process(target=download_task, args=("996 save.pdf",))
p2.start()
p1.join()
p2.join()
end = time()
print("总共耗费%.2f"%(end-start))
if __name__ == "__main__":
main()
多线程
- 早期提供了thread模块(现名为_thread)实现多线程,但很多功能未实现
- 推荐使用threading模块
- 可以继承Thread类来自定义个线程类
Lock
Condition
Event
Semaphore
和Barrier
解决多线程互斥的问题
from threading import Thread
from random import randint
from time import time, sleep
def download_task(filename):
print("开始下载%s..."%filename)
time_to_download = randint(5,10)
sleep(time_to_download)
print("%s下载完成,耗费%d秒"%filename,time_to_download)
def main():
start = time()
p1 = Thread(target=download_task, args=("python从入门到放弃.pdf",))
p1.start()
p2 = Thread(target=download_task, args=("996 save.pdf",))
p2.start()
p1.join()
p2.join()
end = time()
print("总共耗费%.2f"%(end-start))
if __name__ == "__main__":
main()
单线程+异步I/O-------python协程
- 基于事件驱动模型
- 没有线程切换的开销
- 不需要多线程的锁机制
- 可以充分利用CPU
- 主要是通过回调或者future对象来获取任务执行结果
asyncio
模块和await
和async
关键字来支持异步处理
import asyncio
def num_generator(m, n):
yield from range(m, n+1)
async def prime_filter(m, n):
primes = []
for i in num_generator(m,n):
flag = True
for j in range(2, int(i ** 0.5 + 1)):
if i % j == 0:
flag = False
break
if flag:
primes.append(i)
return tuple(primes)
async def square_mapper(m, n):
squares = []
for i in num_generator(m, n):
squares.append(i * i)
await asyncio.sleep(0.001)
return squares
def main():
loop = asyncio.get_event_loop()
future = asyncio.gather(prime_filter(2,100), square_mapper(1,100))
future.add_done_callback(lambda x: print(x.result))
loop.run_until_complete(future)
loop.close()
if __name__ == "__main__":
main()
本文作者:xnzone
本文链接:https://www.cnblogs.com/xnzone/p/14392179.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)