分享

Python 3.11中的多线程和协程与进程进程

 禁忌石 2023-05-08 发布于浙江

Python 3.11中提供了多线程、协程和多进程的支持,这些功能使得并发编程变得更加容易。本文将详细介绍Python 3.11中的线程、协程和进程,并通过具体的示例来说明如何实现这些功能,并介绍如何实现守护进程、进程间通信和并发编程。

文章图片1

1. 线程和协程

Python 3.11中支持多线程和协程的实现,它们都可以在单个进程中执行多个任务,从而提高程序的效率。

- 线程:

线程是轻量级的并发执行的方式,在同一进程中可以创建多个线程,各线程之间可以并发执行不同的任务。Python 3.11中使用`threading`模块来实现多线程编程。例如,下面的代码创建了两个线程来同时执行两个函数:

```python

import threading

def func1():

for i in range(5):

print('hello')

def func2():

for i in range(5):

print('world')

t1 = threading.Thread(target=func1)

t2 = threading.Thread(target=func2)

t1.start()

t2.start()

t1.join()

t2.join()

```

这个例子创建了两个线程,分别执行`func1()`和`func2()`函数。`start()`方法启动线程,`join()`方法等待线程完成执行。

文章图片2

- 协程:

协程是一种更加轻量级的并发执行方式,它的执行过程可以在单个线程中进行。Python 3.11中使用`asyncio`模块来实现协程编程。例如,下面的代码演示了如何使用协程实现异步执行的效果:

```python

import asyncio

async def func():

print('start')

await asyncio.sleep(1)

print('end')

async def main():

await asyncio.gather(func(), func(), func())

loop = asyncio.get_event_loop()

loop.run_until_complete(main())

```

这个例子定义了一个协程`func()`,并使用`asyncio`模块的`sleep()`函数来模拟异步执行,并且在执行时使用`asyncio.gather()`函数来同时执行多个协程。

文章图片3

2. 进程

Python 3.11中也支持多进程的实现,它可以在多个CPU核心上同时执行不同的任务,从而提高程序的效率。Python 3.11中使用`multiprocessing`模块来实现多进程编程。例如,下面的代码演示了如何使用多进程并行计算两个任务:

```python

import multiprocessing

def square(x):

return x * x

if __name__ == '__main__':

with multiprocessing.Pool(2) as pool:

results = pool.map(square, [1, 2, 3, 4, 5])

print(results)

```

这个例子使用了`multiprocessing.Pool()`函数来创建一个进程池,使用`map()`方法并行执行任务,同时使用`if __name__ == '__main__':`语句来避免子进程重复执行主程序。

3. 守护进程和进程间通信

- 守护进程:

守护进程是一种后台进程,它会在主进程退出后自动关闭。Python 3.11对守护进程提供了很好的支持。可以使用`multiprocessing.Process`创建一个守护进程并通过设置`daemon`参数为`True`来实现,例如下面的代码:

```python

import multiprocessing

import time

def worker():

while True:

print('worker is running')

time.sleep(1)

if __name__ == '__main__':

p = multiprocessing.Process(target=worker)

p.daemon = True

p.start()

time.sleep(3)

print('main thread is exiting')

```

这个例子创建一个守护进程,通过设置`daemon`参数为`True`来设置为守护进程;同时在主线程中等待3秒后退出,并发现守护进程也同时退出了。

- 进程间通信

多个进程可以通过`multiprocessing.Queue`类来实现进程间通信,例如下面的代码:

```python

import multiprocessing

def sender(queue):

for i in range(5):

queue.put(i)

def receiver(queue):

while True:

data = queue.get()

if data is None:

break

print(data)

if __name__ == '__main__':

queue = multiprocessing.Queue()

p1 = multiprocessing.Process(target=sender, args=(queue,))

p2 = multiprocessing.Process(target=receiver, args=(queue,))

p1.start()

p2.start()

p1.join()

queue.put(None)

p2.join()

```

这个例子创建了两个进程,分别执行发送数据和接收数据的操作,使用`multiprocessing.Queue`实现两个进程间的通信。

4. 并发编程

Python 3.11提供了多线程、协程和多进程的支持,可以使用这些功能来实现并发编程。例如,下面的代码展示了如何同时使用多线程和协程实现异步执行的效果:

```python

import threading

import asyncio

async def func():

print('start')

await asyncio.sleep(1)

print('end')

def main():

t1 = threading.Thread(target=asyncio.run, args=(func(),))

t2 = threading.Thread(target=asyncio.run, args=(func(),))

t1.start()

t2.start()

t1.join()

t2.join()

if __name__ == '__main__':

main()

```

这个例子创建了两个线程,分别执行`func()`函数的协程对象,并且使用`asyncio.run()`函数来运行。这样可以实现异步执行的效果,提高程序的效率。

总之,Python 3.11中支持多线程、协程和多进程,并提供了多种实现方式和多种用法,可以用于实现并发编程、容错性能、高并发性等多种应用场景。需要根据具体的需求来选择适当的并发编程方式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多