python线程请解释

2024-04-26 04:38:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解线程在python中是如何工作的,我对一些事情有点困惑。你知道吗

我的印象是,在使用线程时,您可以同时并行运行不同的任务?你知道吗

下面的代码将演示我在线程方面遇到的一些问题。 (我知道有更好的方法来编写端口扫描仪,但这将澄清我遇到的问题)

=============开始示例==============

    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秒来执行?你知道吗

如果有人能解释一下我做错了什么,我将不胜感激。你知道吗

蒂亚!你知道吗


Tags: 端口代码nameimport示例defsocketcurrent
1条回答
网友
1楼 · 发布于 2024-04-26 04:38:41

需要考虑的一件事是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

结果来自Fedora20,4核CPU笔记本电脑扫描40000个端口(或者每个线程/进程10000个端口)。你知道吗

相关问题 更多 >