Python多线程与多进程相关知识总结
多线程
多线程是指在同一进程中,多个线程并行执行不同的任务。Python提供了线程模块threading来处理多线程相关问题。线程模块允许开发商在单一进程内创建多个线程,从而最大限度地利用CPU资源。下面是一个简单的创建线程的示例代码:
import threading
def worker(num):
"""线程的工作函数"""
print('Worker %s is running' % num)
if __name__ == '__main__':
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
该示例中,创建了5个线程,每个线程都调用了worker函数执行任务。运行结果如下:
Worker 0 is running
Worker 1 is running
Worker 2 is running
Worker 3 is running
Worker 4 is running
需要注意的是,Python的多线程虽然可以在一定程度上提高程序运行效率,但由于GIL(Global Interpreter Lock,全局解释器锁)的存在,多线程的效率提升并不明显。因此,在需要大量计算密集型的任务时,建议使用多进程。
多进程
多进程指的是在不同的进程中并行执行不同的任务。Python提供了multiprocessing模块来处理多进程相关问题。multiprocessing模块是Python标准库中的模块,旨在提供一个能够与线程模块兼容的进程模块。下面是一个简单的创建进程的示例代码:
import multiprocessing
def worker(num):
"""进程的工作函数"""
print('Worker %s is running' % num)
if __name__ == '__main__':
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
该示例中,创建了5个进程,每个进程都调用了worker函数执行任务。运行结果如下:
Worker 0 is running
Worker 1 is running
Worker 2 is running
Worker 3 is running
Worker 4 is running
需要注意的是,在多进程中,由于每个进程都有独立的内存空间,因此需要使用进程通信来进行数据的交互。常用的进程通信方式有管道(Pipe)、消息队列(Queue)和共享内存(Value、Array)等。
示例1:使用进程池处理大量计算密集型任务
在需要大量计算密集型任务时,使用进程可以获得更好的性能提升。下面是一个示例代码:
import multiprocessing
import time
def calc(num):
"""模拟一个计算密集型任务"""
res = 0
for i in range(100000):
res += i * i
return res
if __name__ == '__main__':
start_time = time.time()
pool = multiprocessing.Pool(processes=4) # 创建进程池,包含4个进程
results = pool.map(calc, range(100)) # 对0~99之间的数进行计算
pool.close()
pool.join()
print('Time costs:', time.time() - start_time)
该示例中,使用进程池调用calc函数对0~99之间的数进行计算。由于使用了进程池,可以看到程序运行速度得到了极大的提升。
示例2:使用多线程进行网络爬取
网络爬取是一个典型的IO密集型任务,使用多线程可以充分利用CPU资源,提高程序运行效率。下面是一个使用多线程进行网络爬取的示例代码:
import threading
import requests
import time
def fetch(url):
"""爬取指定url的内容"""
res = requests.get(url)
print('Fetch', url, 'done')
if __name__ == '__main__':
urls = ['https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com']
threads = []
start_time = time.time()
for url in urls:
t = threading.Thread(target=fetch, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
print('Time costs:', time.time() - start_time)
该示例中,使用多线程爬取指定url的内容。由于使用了多线程,可以看到程序运行速度得到了显著的提升。
以上就是Python多进程与多线程相关知识的总结,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程与多进程相关知识总结 - Python技术站