简介:今天,首席CTO注释要与您分享与Python相关的几个过程。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
初始化池时,您可以指定最大过程。当将新请求提交到池中,如果池不满,则将创建一个新的进程以执行请求;要达到指定的最大值,则该请求将等到该进程在池中结束,上一个过程将用于执行新任务。
最大过程仅受操作系统资源的限制。
过程越好,程序越快。
通常有几个CPU核心,打开了多少个过程,或核心号的n倍。
由于该进程池一次只能一次运行4个进程,因此0,1,2,3是同时的四个过程,然后只能等待4个进程。在进程池中的任何过程结束后,都立即执行4个进程。因此,在0结束后,执行执行,然后1,2,3接一个地结束,而4个最终结束。
如前所述,为什么建议使用Python使用多流程而不是多线程,但是多过程也有其自己的限制:与线程更大和切换时间相比,在Python的多过程中,流程的数量不建议超过CPuthe核心号(一个过程仅一个GIL,因此一个过程只能运行CPU),因为当过程占据CPU时,一个过程可以充分利用机器的性能,但是会有在此过程中频繁切换过程,但这将是毫无价值的。
但是,在特殊情况下(特别指的是IO密集型任务),多线程比多过程更好。
例如:给您200W URL,您需要抓住与每个URL相对应的页面。目前,仅使用多个过程,效果绝对是不好的。为什么?
例如,每个请求的等待时间为2秒,然后是以下内容(忽略CPU计算时间):
1.单个过程+单线程:需要2秒*200W = 400W秒== 1111.11小时== 46.3天,显然是不可接受的
2.单个过程+多线程:例如,我们在此过程中打开了10个多线程,与1相比,它可以增加10倍,即约4.63天可以完成200W的爬网。请注意,这里的实际执行是实际执行在这里。:线程1遇到阻塞,CPU开关到线程2进行执行,遇到阻塞并切换到线程3等。在10个线程被阻止后,过程被阻止。执行操作,因此速度可以提高约10次(在这里,由于线程切换引起的开销,实际上不应是10次),但是有必要考虑切换的切换该线程也可以预期,因此有一个开销,Socan不会启动多线程(200W线程绝对不可靠)
3. Multi -Processes+Multi -threads:在这里真是太神奇了。一般而言,许多人使用这种方法。在多进程下,每个过程都可以占据CPU,并且多线程螺纹绕过等待在一定程度上的阻塞。因此,它比单个过程中的多线程线更好。例如,我们在每个过程中打开10个过程和20W线程。它是10次以上,而不是10次,主要是因为CPU开关200W线程消耗绝对比20W过程大得多,考虑到这部分费用,因此它超过10次)。
有更好的方法吗?答案是肯定的,是:
4.理事会,让我们谈谈在使用它之前什么/为什么/如何/为什么/为什么使用它/如何使用它)
什么:
理事会是一个用户级别的轻量级线程。Coroutine具有自己的寄存器上下文并堆叠。当Coroutine调度和切换时,将寄存器上下文保存并堆叠到其他地方。缩短时,还原先前保存的寄存器上下文并堆栈。
Coroutine可以保留先前呼叫的状态(即所有当地状态的特定组合)。每次重新输入该过程时,它等同于输入最后一个呼叫的状态。
在并发编程中,Coroutine类似于线程。每个Coroutine代表一个具有自己本地数据的执行单元,并与其他Coroutines共享全局数据和其他资源。
FAL:
目前,主流语言基本上选择了多线程作为并发设施。线程相关概念的概念是抓住Premptive多任务处理,而协作多任务与Coroutine有关。
无论是过程还是线程,每次被阻止或切换时,都需要在系统调用(系统调用)中捕获,首先让CPU运行操作系统调度程序,然后计划计划程序决定哪个过程(线程)应运行。
而且,由于夺取计划执行的顺序的特征,在使用线程时,有必要非常仔细地处理同步问题,并且根本没有这样的问题(事件驱动程序和异步程序具有相同的优势)。
因为Coroutine是用户本身编写调度逻辑的用户,因此对于CPU,Coroutine实际上是一个线程,因此CPU无需考虑如何安排,切换上下文,这消除了CPU切换在上面的上空,因此在确定性上可以肯定的是,它比多线程更好。
如何:
如何在Python中使用Coroutines?答案是使用Gevent,如何使用:请参阅此处
使用公司不能受到线程开销的限制。我试图一次将20W URL放入一次过程中。这完全很好。
因此,最建议的方法是多进程+coroutine(可以在每个过程中视为单个线程,并且该单个线程被纠正)
在多个流程+Coroutines下,CPU开关开销已被避免,并且可以使用多个CPU来充分利用它。对于具有大量数据和文件读写的爬行动物的效率,此方法是巨大的。
尖端:
[python]查看普通副本
# - * - 编码= UTF-8 - * -
导入请求
从多处理导入过程
进口Gevent
来自Gevent Import Monkey;monkey.patch_all()
导入系统
重新加载(系统)
sys.setdefaultencoding('utf8')
def提取(url):
尝试:
s = requests.session()
r = s.get(url,timeout = 1)#在这里抓取页面
除例外,E:
打印e
返回 '??'
def Process_start(url_list):
任务= []
对于URL_LIST中的URL:
tasks.append(gevent.spawn(fetch,url))
gevent.joinall(任务)#use coroutine执行
def task_start(filepath,flag = 100000):#启动每个10W URL的进程
使用开放(filepath,'r')作为读取器:##从给定文件中读取URL
url = reader.readline()。条 ()
url_list = []#该列表用于存储公司任务
i = 0#计数器,在公司队列中添加了多少个URL
url!='':
i+= 1
url_list.append(url)#each阅读URL,将URL添加到队列中
如果i == flag:#a某些URL数量启动一个进程并执行
p = process(target = process_start,args =(url_list,))
p.start()
url_list = [] #reset url队列
i = 0#重置计数器
url = reader.readline()。条 ()
如果url_list不[]:#如果您退出循环,则在任务队列中仍然有URL的剩余
p = process(target = process_start,args =(url_list,))#
p.start()
如果__name__ =='__ main __':
task_start('https://www.shouxicto.com/article/testdata.txt')
仔细的同学会发现上面的示例隐藏了一个问题:随着URL数量的增加,过程的数量将继续增加。我们不使用流程池多处理。池在这里控制过程的数量。气味有冲突,不能同时使用,但是感兴趣的学生可以研究gevent.pool coroutine pool。
Python单个过程的最大连接数为1024。插座连接编号的理论值应等于可以打开的过程的最大文件描述符。
结论:以上是首席CTO的全部内容注明了每个人都为每个人打开了多少个Python的过程。感谢您阅读本网站的内容。我希望这对您有帮助。有关Python将打开多少流程的更多信息,请不要忘记在此网站上找到它。