python多线程是不是真正的并发,python的多进程是并发还是并行

  python多线程是不是真正的并发,python的多进程是并发还是并行

  python3.6

  线程和多重处理

  四核三星250g-850-固态硬盘

  自从多进程多线程编程以来,我从来不知道谁更快。网上很多人说python的多进程更快。这是因为GIL(全局解释器锁)。但是,我写代码的时候,测试时间多线程更快,那么这是怎么回事呢?最近做分词的时候,原码速度太慢,想办法找个有效的方法。(文末有代码和效果图。

  现在,我们来看看线程和进程哪个程序更快的结果图。

  几个定义

  平行意味着两个或更多的事件同时发生。同时意味着两个或多个事件在同一时间间隔发生。

  它是线程操作系统可以执行操作调度的最小单位。它包含在流程中,是流程的实际操作单元。程序的执行例子是一个进程。

  流程的实施

  Python的多线程显然要获取GIL,执行代码,最后释放GIL。因此,因为它是GIL,所以在多线程时不可用。实际上,这是一个并行实现,其中多个事件在同一时间间隔发生。

  但是,该流程具有独立的GIL,因此可以并行实现。所以对于多核CPU来说,理论上使用多个进程可以更高效的利用资源。

  实际问题

  Python多线程经常可以在在线教程中看到。比如网络爬虫教程,端口扫描教程。

  现在,从端口扫描的角度来看,如果下面的脚本以多进程的方式实现,可以看到python的多进程速度更快。那么这不是违背了我们的分析吗?

  导入系统,线程

  从套接字导入*

  host= 127 . 0 . 0 . 1 iflen(sys . argv)==1 else sys . argv[1]

  portlist=[iforinrange(1,1000 ) ]

  扫描列表=[]

  锁=线程。锁定(

  print(pleasewaiting.from),host).

  efscanport(端口) :

  尝试:

  TCP=socket(af_inet,SOCK_STREAM)).

  TCP.connect((主机,端口) )

  除了:

  及格

  否则:

  if lock.acquire():

  print([]port、port、open)))))).

  锁定.释放(

  最后:

  tcp.close(

  对于端口列表中的p:

  t=threading . thread(target=scan port,args=(p,) )

  扫描列表。追加(t)。

  forIinrange(Len)端口列表) :

  扫描列表[i]。开始(

  forIinrange(Len)端口列表) :

  扫描列表[i]。加入(

  谁更快?

  由于python锁问题,如果线程发生锁争用或线程间切换,就会消耗资源。所以,大胆猜测一下:

  在CPU密集型任务中,多进程更快或更有效。I/o负载重,多线程可以提高效率。

  请看下面的代码:

  导入时间

  导入标题

  导入多重处理

  max_process=4

  最大线程数=最大进程数

  deffun(n,n2):

  #cpu负载高

  forIinrange(0,n):

  forjinrange(0,)int ) (n*n*n*n2)):

  t=i*j

  defthread_main(N2):

  thread_list=[]

  forIinrange(0,max_thread):

  t=threading.thread(target=fun,args=(50,n2))

  thread_list.append(t))。

  开始=时间.时间(

  print("[]more threadstart ))))))。

  对于线程列表中的I:

  i.start())

  对于线程列表中的I:

  i.join())

  print([-]muchthreaduse ,time.time ) )-start, s )

  efprocess_main(N2):

  p=多进程池(max _ process)

  forIinrange(0,max_process):

  p.apply_async(func=fun,args=(50,n2))

  开始=时间.时间(

  Print ([] muchprocessstart))。

  P.close(#关闭进程池

  P.join(#等待所有子进程完成。

  print([-]muchprocessuse ,time.time )-start, s )

  if __name__==__main__ :

  print([]whenn=50,n2=0.1:))))))))).

  thread_main(0.1)).

  Process _ main (0.1))。

  print([]whenn=50,n2=1:))))))))))))))).

  thread_main(1))。

  Process _ main (1))。

  print([]whenn=50,n2=10:)))))))))))))).

  thread_main(10)).

  Process _ master (10))。

  结果如下。

  可以看到,随着cpu利用率的提高,代码循环的增加,差距越来越大。验证我们的预期。

  高CPU和I/o负载

  1.CPU密集型代码(各种循环处理、计数等。)).

  2.IO密集型代码(文件处理、网络爬虫等。)).

  判断方法:

  1.直接检查CPU利用率和HDDI/o读写速度。

  2.计算多CPU等待时间长(例如网络爬虫)-IO

  3.请自行百度。

  python多进程和多线程哪个更快?细节是编辑分享的所有内容。希望可以作为参考。另外,我想支持购买源代码。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: