我试图理解线程在python中是如何工作的,我对一些事情感到有点困惑。
我的印象是,在使用线程时,可以同时并行运行不同的任务?
下面的代码将演示我在线程方面遇到的一些问题。(我知道有更好的方法来编写端口扫描器,但这将澄清我遇到的问题)
============ Start示例============
import socket
import threading
def test2(start,end):
for i in range(int(start),int(end)):
server = 'localhost'
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((server,i))
print("port", i , "is open", threading.current_thread().name)
s.close()
except socket.error as e:
s.close()
def threader():
print(threading.current_thread().name)
if threading.current_thread().name == "Thread-0":
test2(1,1000)
elif threading.current_thread().name == "Thread-1":
test2(1000,2000)
elif threading.current_thread().name == "Thread-2":
test2(2000,3000)
elif threading.current_thread().name == "Thread-3":
test2(3000,4000)
for i in range(4):
t = threading.Thread(target=threader, name= "Thread-"+str(i))
t.start()============结束示例============
如果我用一个线程扫描1000个端口,通常需要7-8秒。
上面代码的问题是,这需要大约30秒的时间来执行。
如果所有线程都在并行运行,并且正在扫描相同数量的端口,那么是否应该花费大约7-8秒的时间来执行?
如果有人能解释一下我在这里做错了什么,我将非常感激。
蒂娅!
发布于 2015-05-04 04:00:43
需要考虑的一件事是CPython的线程实现。由于所谓的全局解释器Lock - GIL (你可以在https://wiki.python.org/moin/GlobalInterpreterLock上找到更多信息),Python中没有真正的并行性。
这意味着在一个任务上运行更多的线程实际上可能会有更差的性能结果,因为需要在这些线程和它们的串行运行时之间进行上下文切换。
如果您希望获得真正的加速,您可以使用支持并行处理的不同Python实现(例如Jython),也可以研究multiprocessing模块。
我已经修改了您的代码,给出了各种实现的运行时间示例:
2.47829794884 # serial port scan
2.47367095947 # threaded port scan
0.693325996399 # port scan using multiprocessing结果来自Fedora 20,4核CPU笔记本电脑,扫描40000个端口(或每个线程/进程10000个端口。
https://stackoverflow.com/questions/30018686
复制相似问题