what?
进程和线程概念:
流程是资源消耗的最小单位
线程是内核调度运行的最小单位
进程和线程之间的主要区别:
进程间相互独立,master进程通过fork )系统调用派生子进程
线程共享内存区域,主线程派生子线程
why?
进程和线程的优缺点:
流程:
优点:由于每个进程都有独立的内存空间,所以更加稳定,不受子进程之间的影响。 但是,如果主进程崩溃,就会变得全球化。 另外,python中不受GIL (全局解释器锁)的制约,可以有效利用多核cpu
缺点:内存资源占用量大,创建进程比线程成本高
线程:
优点:因为共享内存空间,所以资源消耗少,成本比进程低。 在python中,由于GIL的限制,只能使用一个cpu核心,因此在某个时刻只能运行一个线程
缺点:共享内存空间也有缺点,资源征用问题(在python中可以用锁定机制限制),而且如果一个线程崩溃,整个进程就有可能崩溃
fork ) )系统调用:
是在unix/linux上用于创建子进程的相对特殊的系统调用。 其他系统调用函数的特殊之处在于,通常在一次调用中返回一次,在fork (在调用中返回两次(父进程pid子进程pid ),fork )调用中返回的子进程pid始终为0
where? (用python思考)
多进程和多线程的共同目标是实现多任务处理
任务类型:高cpu和I/o负载
cpu密集型:需要使用多进程,充分利用多核cpu实现真正的并发
I/o密集型:可以使用多线程节约资源
什么?
在python中如何使用多进程和多线程编程?
多线程
python为多线程支持提供了两个基本库。 下层的thread模块和上层的threading模块
实现原理:
将同时执行的代码作为自变量传递给threading.Thread ()制作线程对象,与程序控制结构(循环)等组合完成该线程对象start ) )的多次调用
代码示例:(多线程实现并发套接字通信服务端() ) )。
导入导入线程库
导入importsocket##socket
s=socket.socket #创建socket对象
s.bind((0.0.0.0),8888 ) #绑定套接字
监听s.Listen(10 ) #套接字
def run ) : #定义处理函数
sock,addr=s.accept (
while True:
a=sock.recv(1024 ) )。
if a:
sock.send(a.upper ) )
else:
sock.close (
布莱克
if __name__=='__main__':
forIinxrange(20 ) : # )基于for循环创建20个线程
t=threading.thread(target=run ) #创建线程对象
运行t.start线程
本示例的第二种格式:
导入导入线程库
导入importsocket##socket
s=socket.socket #创建socket对象
s.bind((0.0.0.0),8888 ) #绑定套接字
监听s.Listen(10 ) #套接字
类我的thread (threading.thread ) :
defrun(self ) : #定义处理函数
sock,addr=s.accept (
while True:
a=sock.recv(1024 ) )。
if a:
sock.send(a.upper ) )
else:
sock.close (
布莱克
if __name__=='__main__':
forIinxrange(20 ) : # )基于for循环创建20个线程
创建t=Mythread线程对象
运行t.start线程
2 .多进程
python提供了用于创建进程对象的多进程模块中的process类、用于创建进程池对象的Pool类以及通过Queue和Pipe实现的进程间通信
实现原理:
将同时执行的代码作为自变量传递给multiprocessing.Process ()制作流程对象(流程对象start ) )的多次调用与程序控制结构(循环)等组合后完成
代码示例:(通过多进程实现并发套接字通信服务端() ) )。
导入多进程# #线程库
导入importsocket##socket
s=socket.socket #创建socket对象
s.bind((0.0.0.0),8888 ) #绑定套接字
监听s.Listen(10 ) #套接字
def run ) : #定义处理函数
sock,addr=s.accept (
while True:
a=sock.recv(1024 ) )。
if a:
sock.send(a.upper ) )
else:
sock.close (
布莱克
if __name__=='__main__':
forIinxrange(20 ) : # )基于for循环创建20个线程
t=multi process.process (target=run ) #创建线程对象
运行t.start线程
可以确认在ps aux | grep python中运行了20个进程
同上:也可以通过定制类并继承Process类来重新实例化对象的方式进行编写
总之,在多任务情况下,并发是一个不可避免的问题,虽然多进程和多线程可以并发,但它们都有不可避免的缺点,所以通过nginx这样的单进程或单线程实现并发任务的处理基于事件驱动,用python实现该机制称为协和式。