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