Python3 并发编程小练习

1. 什么是Python3 并发编程?

并发编程是指同时进行多个任务的编程方式,在Python中可以通过多线程、多进程和协程等方式来实现。

1.1 多线程

多线程是指在一个进程中运行多个线程,多个线程共享进程的内存空间,可以并发执行多个任务,提高了程序运行效率。Python中的多线程模块为threading,可以通过继承threading.Thread类或直接使用函数来创建线程。

下面是一个简单的多线程例子:

import threading

import time

class MyThread(threading.Thread):

def run(self):

for i in range(5):

print('线程:%s 执行:%s' % (self.name, i))

time.sleep(1)

if __name__ == '__main__':

th1 = MyThread()

th2 = MyThread()

th1.start()

th2.start()

在多线程中要注意线程间的同步问题,避免出现数据紊乱等问题,可以使用锁机制来实现。

1.2 多进程

多进程是指在不同的进程中执行多个任务,相当于启动多个相互独立的程序,可以充分利用多核CPU的性能。Python中的多进程模块为multiprocessing,可以通过Process类来创建进程。

下面是一个简单的多进程例子:

import multiprocessing

def func():

for i in range(5):

print('进程:%s 执行:%s' % (multiprocessing.current_process().name, i))

if __name__ == '__main__':

p1 = multiprocessing.Process(target=func)

p2 = multiprocessing.Process(target=func)

p1.start()

p2.start()

多进程中要注意进程间的通信问题,不同的进程之间的数据无法共享,可以使用进程间通信(IPC)的机制来实现数据的传递。

1.3 协程

协程是一种用户态的轻量级线程,可以在同一个线程中实现多个任务的并发执行,不需要像多线程那样使用锁机制来同步数据。Python中的协程模块为asyncio,可以使用async和await关键字来定义协程。

下面是一个简单的协程例子:

import asyncio

async def func():

for i in range(5):

print('协程执行:%s' % i)

await asyncio.sleep(1)

if __name__ == '__main__':

loop = asyncio.get_event_loop()

tasks = [func(), func()]

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

协程中要注意任务之间的切换问题,可以使用yield或asyncio.sleep等方式来实现任务之间的切换。

2. Python3 并发编程中的应用场景

Python3 并发编程可以应用于许多场景,例如网络编程、爬虫、数据处理等领域。

2.1 网络编程

在网络编程中常常需要同时处理多个客户端请求,可以使用多线程或协程来实现并发处理请求。例如,使用多线程实现一个简单的Echo服务器:

import socket

import threading

def echo_handler(conn, addr):

while True:

data = conn.recv(1024)

if not data:

break

conn.send(data)

conn.close()

if __name__ == '__main__':

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(('127.0.0.1', 8080))

server.listen(5)

while True:

conn, addr = server.accept()

t = threading.Thread(target=echo_handler, args=(conn, addr))

t.start()

2.2 爬虫

在爬虫中需要同时对多个网站进行抓取,并对数据进行分析处理,可以使用多进程或协程来提高抓取效率并且避免被封IP。例如,使用协程实现一个简单的爬虫:

import aiohttp

import asyncio

import async_timeout

async def fetch(session, url):

with async_timeout.timeout(10):

async with session.get(url) as response:

return await response.text()

async def task(url):

async with aiohttp.ClientSession() as session:

html = await fetch(session, url)

print(html[:50])

if __name__ == '__main__':

urls = ['http://www.baidu.com']*2

loop = asyncio.get_event_loop()

tasks = [task(url) for url in urls]

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

2.3 数据处理

在数据处理中常常需要对大量数据进行计算、分析、排序等操作,可以使用多进程或协程来提高处理效率。例如,使用多进程来实现一个简单的数据排序程序:

import random

import multiprocessing

def sort(data):

return sorted(data)

if __name__ == '__main__':

data = [random.randint(0, 100) for i in range(10000)]

p = multiprocessing.Pool(4)

result = p.apply_async(sort, args=(data,))

p.close()

p.join()

print(result.get()[:10])

3. 小结

Python3 并发编程是一种提高程序运行效率和性能的方式,可以通过多线程、多进程和协程来实现。并发编程可以应用于许多场景,例如网络编程、爬虫、数据处理等领域。在并发编程中要注意线程/进程/协程之间的同步和通信问题,避免出现数据紊乱等问题。

后端开发标签