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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。