首页 > 编程知识 正文

python有多线程吗,java多进程和多线程

时间:2023-05-06 10:18:59 阅读:140516 作者:2439

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实现该机制称为协和式。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。