天天看點

Python 3.11中的多線程和協程與程序程序

作者:wjmsir

Python 3.11中提供了多線程、協程和多程序的支援,這些功能使得并發程式設計變得更加容易。本文将詳細介紹Python 3.11中的線程、協程和程序,并通過具體的示例來說明如何實作這些功能,并介紹如何實作守護程序、程序間通信和并發程式設計。

Python 3.11中的多線程和協程與程式程式

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()`方法等待線程完成執行。

Python 3.11中的多線程和協程與程式程式

- 協程:

協程是一種更加輕量級的并發執行方式,它的執行過程可以在單個線程中進行。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()`函數來同時執行多個協程。

Python 3.11中的多線程和協程與程式程式

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中支援多線程、協程和多程序,并提供了多種實作方式和多種用法,可以用于實作并發程式設計、容錯性能、高并發性等多種應用場景。需要根據具體的需求來選擇适當的并發程式設計方式。