###创建进程
由于GIL问题,CPython中的多线程是不能很好发挥多核优势的,如果想要发挥多核优势,可以考虑使用多进程。对于多进程的程序,每个进程都有属于自己的GIL,所以多进程不会受GIL的影响,能够很好的发挥多核CPU的优势。对于爬虫这类I/O密集型任务来说,多线程和多进程影响差别并不大。对于计算密集型任务来说,多进程相比多线程,在效率上会有成倍的提升。
我们通过下面的代码来为大家证实多进程的优势。
"""
time python3 example22.py
real 0m11.512s
user 0m39.319s
sys 0m0.169s
使用多进程后实际执行时间为11.512秒,而用户时间39.319秒约为实际执行时间的4倍
这就证明我们的程序通过多进程使用了CPU的多核特性,而且这台计算机配置了4核的CPU
"""
import concurrent.futures
import math
PRIMES = [
1116281,
1297337,
104395303,
472882027,
533000389,
817504243,
982451653,
112272535095293,
112582705942171,
112272535095293,
115280095190773,
115797848077099,
1099726899285419
] * 5
def is_prime(n):
"""判断素数"""
if n % 2 == 0:
return False
sqrt_n = int(math.floor(math.sqrt(n)))
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return False
return True
def main():
"""主函数"""
with concurrent.futures.ProcessPoolExecutor() as executor:
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
print('%d is prime: %s' % (number, prime))
if __name__ == '__main__':
main()
对于Python开发者来说,以下情况需要考虑使用多线程:
- 程序需要维护许多共享的状态(尤其是可变状态),Python中的列表、字典、集合都是线程安全的,所以使用线程而不是进程维护共享状态的代价相对较小。
- 程序会花费大量时间在I/O操作上,没有太多并行计算的需求且不需占用太多的内存。
那么在遇到下列情况时,应该考虑使用多进程:
- 程序执行计算密集型任务(如:字节码操作、数据处理、科学计算)。
- 程序的输入可以并行的分成块,并且可以将运算结果合并。
- 程序在内存使用方面没有任何限制且不强依赖于I/O操作(如:读写文件、套接字等)。
温馨提示:学习中如果遇到困难,可以加QQ交流群询问。
付费群:789050736,群一直保留,供大家学习交流讨论问题。
免费群:151669801,仅供入门新手提问,定期清理群成员。