当前位置: 首页 > 网络应用技术

打开多少个Python的过程(2023年最新的完成)

时间:2023-03-06 15:15:46 网络应用技术

  简介:今天,首席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将打开多少流程的更多信息,请不要忘记在此网站上找到它。