用scapy发送icmp包。开了200个线程,每个线程发送一个包后结束。测试了下只有300包/sec的速度,是python的多线程效率不高的问题吗?
---------------------------------------
后来发现不是多线程的问题,是scapy本来发包就慢的问题。单线程scapy每秒几个包,多线程最多每秒60.用C写的话每秒3w..
回复内容:
Python由于有全锁局的存在(同一时间只能有一个线程执行),并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。
开了200个线程,每个线程发送一个包后结束。
=========
换个姿势黑Python好吗?比如说for循环比C语言慢几万倍什么的。
不同线程同时访问资源时,需要使用保护机制,Python中使用GIL(解释器全局锁)。直观上,这是一个加在解释器上的全局(从解释器的角度看)锁。这意味着对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。所以,如果没有IO操作,python中的多线程比单线程效率还低。
可以看这个 Python 最难的问题
看了上面的评论,我很难理解为何我的python程序可以吧12个核都跑满,不管用python2.6 还是2.7 还是pypy。真不知道python程序只能跑在一个核上的谣言是被这些半吊子传成这样很凶残的状况。一个半吊子python程序员写的程序非常可能在性能上高于一个半吊子c程序员的程序。gil是针对一个python解释器进程而言的,这才是真相,如果解释器可以多进程解释执行,那就不存在gil的问题了,同样,他也不会导致你多个解释器跑在同一个核上。
scapy 用的libcap的库效率很慢 可以试试scapy 的sendpfast 要快很对
搜索关键词是 Global Interpreter Lock
虽然我好多年没用Py写项目了,但是我想问:
> 开了200个线程,每个线程发送一个包后结束。
这样真的好么。。。线程真的是不要钱随便开的么。。。
发现多线程程序在速度达到一定值以后,增加线程数并没有获得速度上的增长,后来索性用multiprocess了
尽量使用不变量作为共享数据可以缓解,另外用pypy快很多,pypy搭载了JIT。
试试Jython?
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn