首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python线程-请解释

python线程-请解释
EN

Stack Overflow用户
提问于 2015-05-04 03:56:32
回答 1查看 73关注 0票数 2

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

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

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

============ Start示例============

代码语言:javascript
复制
    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秒的时间来执行?

如果有人能解释一下我在这里做错了什么,我将非常感激。

蒂娅!

EN

回答 1

Stack Overflow用户

发布于 2015-05-04 04:00:43

需要考虑的一件事是CPython的线程实现。由于所谓的全局解释器Lock - GIL (你可以在https://wiki.python.org/moin/GlobalInterpreterLock上找到更多信息),Python中没有真正的并行性。

这意味着在一个任务上运行更多的线程实际上可能会有更差的性能结果,因为需要在这些线程和它们的串行运行时之间进行上下文切换。

如果您希望获得真正的加速,您可以使用支持并行处理的不同Python实现(例如Jython),也可以研究multiprocessing模块。

我已经修改了您的代码,给出了各种实现的运行时间示例:

代码语言:javascript
复制
2.47829794884 # serial port scan
2.47367095947 # threaded port scan
0.693325996399 # port scan using multiprocessing

结果来自Fedora 20,4核CPU笔记本电脑,扫描40000个端口(或每个线程/进程10000个端口。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30018686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档