进程
首先要先申明:尽量使用多进程,Python找那个的多线程不如多进程。
并且密集cpu的类型尽量别找Python和js这种脚本。效率还是低,高并发可以直接采用nodejs主要愿意是高并发简单而且RESTful方便的很。Python主要用 爬虫大数据统计等科学领域
这一章介绍线程和进程,分布式,高并发,异步等等知识。
首先大家要知道什么是并行和并发。
通常意义上来讲,高并发一般都是单核然而高并行是多核。
并发:因为cpu的速度实在是太快了,所以说,使用单核心轮流执行多任务只要是异步非阻塞io其实是最好不过的,因为cpu的执行速度要远超过io的速度。就例如1000个人光速的去排队的买奶茶一样,还需要1000个窗口吗?他们可是光速!
并行:如果你要计算一个超级复杂巨复杂的任务,这个时候你可以使用高并行,类似于千手观音一样,不过你想还是一个人的手,只是为了完成一个任务罢了。这就是高并行,它并不牵涉到io大多数是计算而已。
Python JavaScript的 Nodejs Golang
他们都可以实现高并发,但是只有golang比较好的能特别的完美的实现高并行,其实就是能运用多核,比如说nodejs的cluster也可以利用多核,但是并不是很好用,golang天生就可以利用多核。
他们实现异步的方式golang实现多协程(协程就是一个比线程还细小的一个单位。) nodejs是c++ 底层实现的多线程线程池,不过在js层面是js的异步回调和事件(回调目前优化为async/await)利用cluster模块 nodejs可以在调用层实现多进程 当然也就是实现多进程。
刚好Python其实它支持了多进程和多线程
启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
还有一种方法是启动一个进程,在一个进程内启动多个线程,这样msr多个线程也可以一块执行多个任务。
当然还有第三种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用
多进程模型
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
print(os.getpid())
g = os.fork()
if g == 0:
print("大家好我是子进程 %s,我的父进程是%s" % (os.getpid(), os.getpid()))
else:
print("我是父进程 %s, 子进程是 %s" % (g, os.getpid()))
# 15642
# 我是父进程 15643, 子进程是 15642
# 大家好我是子进程 15643,我的父进程是15643
多线程
Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。
分布式
Python中的分布式实现起来还是比较简单的。
Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。