Python并发:多线程与多进程的详解
一、概述
在Python中进行并发编程可以使用多线程和多进程,两者都可以利用多核CPU提高程序的性能。多线程主要用于IO密集型任务,多进程则适用于CPU密集型任务。
二、多线程
1. 创建线程
在Python中创建线程可以使用threading
库,具体步骤如下:
import threading
def func():
print("Hello World!")
t = threading.Thread(target=func)
t.start()
2. 传递参数
需要注意的是,如果要传递参数,需要将参数放在一个元组中传递:
import threading
def func(num):
print(f"num is {num}")
t = threading.Thread(target=func, args=(10,))
t.start()
3. 线程锁
多线程需要考虑线程安全的问题,可以使用线程锁进行控制:
import threading
num = 0
lock = threading.Lock()
def func():
global num
for i in range(100000):
lock.acquire()
num += 1
lock.release()
t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t1.start()
t2.start()
t1.join()
t2.join()
print(num)
上述代码创建了两个线程,对共享的变量num
进行加一操作,通过线程锁的方式保证了线程安全的问题。
4. 示例说明
下面给出一个常见的多线程示例:爬虫。
import requests
import threading
def download(url):
r = requests.get(url)
print(f"downloaded {len(r.content)} bytes from {url}")
urls = [
"https://www.baidu.com",
"https://www.sogou.com",
"https://www.douban.com",
"https://www.zhihu.com"
]
threads = []
for url in urls:
t = threading.Thread(target=download, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
print("All downloads finished.")
上述代码创建了多个线程,对多个URL进行下载操作,通过多线程的方式提高了下载的效率。
三、多进程
1. 创建进程
在Python中创建进程可以使用multiprocessing
库,具体步骤如下:
import multiprocessing
def func(num):
print(f"num is {num}")
p = multiprocessing.Process(target=func, args=(10,))
p.start()
2. 进程池
如果需要创建多个进程,可以使用进程池,将任务放入进程池中:
import time
import multiprocessing
def do(num):
time.sleep(1)
return num * num
if __name__ == '__main__':
p = multiprocessing.Pool(4)
nums = [1, 2, 3, 4, 5]
results = p.map(do, nums)
print(results)
上述代码利用multiprocessing.Pool()
函数创建了进程池,并将任务放入进程池中,通过map()
函数来获取每个进程的结果。
3. 示例说明
下面给出一个用于计算圆周率的多进程示例。
import random
import math
import multiprocessing
def pi(n):
count = 0
for _ in range(n):
x, y = random.uniform(-1, 1), random.uniform(-1, 1)
if math.sqrt(x ** 2 + y ** 2) < 1:
count += 1
return 4 * count / n
if __name__ == '__main__':
with multiprocessing.Pool() as pool:
results = pool.map(pi, [1000000]*10)
print(sum(results) / len(results))
上述代码创建了多个进程,利用蒙特卡罗法进行圆周率的计算。可以看出,多进程能够在较短时间内完成较复杂的任务。
四、总结
本文介绍了Python中的多线程和多进程,并通过示例说明了它们的具体用法。在实际应用中,应根据任务类型和CPU核心数量等条件选择适合的并发方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python并发:多线程与多进程的详解 - Python技术站