python最多开多少进程(python多进程)

导读:今天首席CTO笔记来给各位分享关于python最多开多少进程的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

python multiprocessing 最大多少进程

最大进程只受操作系统资源限制.

不是进程越多越好,程序的速度就越快.

一般有几个CPU核心,就开多少进程,或者核心数的N倍.

python进程池最大数量

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

python最多开多少进程(python多进程)  第1张

python最大支持多少线程

python线程太慢了,想并发去用greenlet吧,快,写起来还方便。

如果加锁同步的话,线程多了反而变慢也有可能。

ulimit -s 返回线程栈大小,我的默认是8192, 用内存大小除以它就得到理论上的线程数吧。

python之多线程

进程的概念:以一个整体的形式暴露给操作系统管理,里面包含各种资源的调用。 对各种资源管理的集合就可以称为进程。

线程的概念:是操作系统能够进行运算调度的最小单位。本质上就是一串指令的集合。

进程和线程的区别:

1、线程共享内存空间,进程有独立的内存空间。

2、线程启动速度快,进程启动速度慢。注意:二者的运行速度是无法比较的。

3、线程是执行的指令集,进程是资源的集合

4、两个子进程之间数据不共享,完全独立。同一个进程下的线程共享同一份数据。

5、创建新的线程很简单,创建新的进程需要对他的父进程进行一次克隆。

6、一个线程可以操作(控制)同一进程里的其他线程,但是进程只能操作子进程

7、同一个进程的线程可以直接交流,两个进程想要通信,必须通过一个中间代理来实现。

8、对于线程的修改,可能会影响到其他线程的行为。但是对于父进程的修改不会影响到子进程。

第一个程序,使用循环来创建线程,但是这个程序中一共有51个线程,我们创建了50个线程,但是还有一个程序本身的线程,是主线程。这51个线程是并行的。注意:这个程序中是主线程启动了子线程。

相比上个程序,这个程序多了一步计算时间,但是我们观察结果会发现,程序显示的执行时间只有0.007秒,这是因为最后一个print函数它存在于主线程,而整个程序主线程和所有子线程是并行的,那么可想而知,在子线程还没有执行完毕的时候print函数就已经执行了,总的来说,这个时间只是执行了一个线程也就是主线程所用的时间。

接下来这个程序,吸取了上面这个程序的缺点,创建了一个列表,把所有的线程实例都存进去,然后使用一个for循环依次对线程实例调用join方法,这样就可以使得主线程等待所创建的所有子线程执行完毕才能往下走。 注意实验结果:和两个线程的结果都是两秒多一点

注意观察实验结果,并没有执行打印task has done,并且程序执行时间极其短。

这是因为在主线程启动子线程前把子线程设置为守护线程。

只要主线程执行完毕,不管子线程是否执行完毕,就结束。但是会等待非守护线程执行完毕

主线程退出,守护线程全部强制退出。皇帝死了,仆人也跟着殉葬

应用的场景 : socket-server

注意:gil只是为了减低程序开发复杂度。但是在2.几的版本上,需要加用户态的锁(gil的缺陷)而在3点几的版本上,加锁不加锁都一样。

下面这个程序是一个典型的生产者消费者模型。

生产者消费者模型是经典的在开发架构中使用的模型

运维中的集群就是生产者消费者模型,生活中很多都是

那么,多线程的使用场景是什么?

python中的多线程实质上是对上下文的不断切换,可以说是假的多线程。而我们知道,io操作不占用cpu,计算占用cpu,那么python的多线程适合io操作密集的任务,比如socket-server,那么cpu密集型的任务,python怎么处理?python可以折中的利用计算机的多核:启动八个进程,每个进程有一个线程。这样就可以利用多进程解决多核问题。

python多开是多进程吗

python多开是多进程。根据查询相关公开信息显示,多进程类似于多开应用,属于真正的多核任务,各个进程有独立的资源分配,因此跨进程内存共享需要有专用多进程库支持。

python可以多进程吗

想要充分利用多核CPU资源,Python中大部分情况下都需要使用多进程,Python中提供了multiprocessing这个包实现多进程。multiprocessing支持子进程、进程间的同步与通信,提供了Process、Queue、Pipe、Lock等组件。

开辟子进程

multiprocessing中提供了Process类来生成进程实例

Process([group [, target [, name [, args [, kwargs]]]]])

group分组,实际上不使用

target表示调用对象,你可以传入方法的名字

args表示给调用对象以元组的形式提供参数,比如target是函数a,他有两个参数m,n,那么该参数为args=(m, n)即可

kwargs表示调用对象的字典

name是别名,相当于给这个进程取一个名字

先来个小例子:

# -*- coding:utf-8 -*-

from multiprocessing import Process, Pool

import os

import time

def run_proc(wTime):

n = 0

while n 3:

print \"subProcess %s run,\" % os.getpid(), \"{0}\".format(time.ctime()) #获取当前进程号和正在运行是的时间

time.sleep(wTime) #等待(休眠)

n += 1

if __name__ == \"__main__\":

p = Process(target=run_proc, args=(2,)) #申请子进程

p.start() #运行进程

print \"Parent process run. subProcess is \", p.pid

print \"Parent process end,{0}\".format(time.ctime())

运行结果:

Parent process run. subProcess is 30196

Parent process end,Mon Mar 27 11:20:21 2017

subProcess 30196 run, Mon Mar 27 11:20:21 2017

subProcess 30196 run, Mon Mar 27 11:20:23 2017

subProcess 30196 run, Mon Mar 27 11:20:25 2017

根据运行结果可知,父进程运行结束后子进程仍然还在运行,这可能造成僵尸( zombie)进程。

通常情况下,当子进程终结时,它会通知父进程,清空自己所占据的内存,并在内核里留下自己的退出信息。父进程在得知子进程终结时,会从内核中取出子进程的退出信息。但是,如果父进程早于子进程终结,这可能造成子进程的退出信息滞留在内核中,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。

有什么办法可以避免僵尸进程呢?

这里介绍进程的一个属性 deamon,当其值为TRUE时,其父进程结束,该进程也直接终止运行(即使还没运行完)。

所以给上面的程序加上p.deamon = true,看看效果。

# -*- coding:utf-8 -*-

from multiprocessing import Process, Pool

import os

import time

def run_proc(wTime):

n = 0

while n 3:

print \"subProcess %s run,\" % os.getpid(), \"{0}\".format(time.ctime())

time.sleep(wTime)

n += 1

if __name__ == \"__main__\":

p = Process(target=run_proc, args=(2,))

p.daemon = True #加入daemon

p.start()

print \"Parent process run. subProcess is \", p.pid

print \"Parent process end,{0}\".format(time.ctime())

执行结果:

Parent process run. subProcess is 31856

Parent process end,Mon Mar 27 11:40:10 2017

这是问题又来了,子进程并没有执行完,这不是所期望的结果。有没办法将子进程执行完后才让父进程结束呢?

这里引入p.join()方法,它使子进程执行结束后,父进程才执行之后的代码

# -*- coding:utf-8 -*-

from multiprocessing import Process, Pool

import os

import time

def run_proc(wTime):

n = 0

while n 3:

print \"subProcess %s run,\" % os.getpid(), \"{0}\".format(time.ctime())

time.sleep(wTime)

n += 1

if __name__ == \"__main__\":

p = Process(target=run_proc, args=(2,))

p.daemon = True

p.start()

p.join() #加入join方法

print \"Parent process run. subProcess is \", p.pid

print \"Parent process end,{0}\".format(time.ctime())

执行结果:

subProcess 32076 run, Mon Mar 27 11:46:07 2017

subProcess 32076 run, Mon Mar 27 11:46:09 2017

subProcess 32076 run, Mon Mar 27 11:46:11 2017

Parent process run. subProcess is 32076

Parent process end,Mon Mar 27 11:46:13 2017

这样所有的进程就能顺利的执行了。

结语:以上就是首席CTO笔记为大家整理的关于python最多开多少进程的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-23
下一篇 2023-09-23

相关推荐

发表回复

登录后才能评论