相关疑难解决方法(0)

Python解释器阻止多线程DNS请求?

我只是用python和线程玩了一下,甚至在多线程脚本中实现了DNS请求阻塞.请考虑以下脚本:

来自线程导入线程导入套接字

class Connection(Thread):
    def __init__(self, name, url):
        Thread.__init__(self)
        self._url = url
        self._name = name

    def run(self):
        print "Connecting...", self._name
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.setblocking(0)
            s.connect((self._url, 80))
        except socket.gaierror:
            pass #not interested in it
        print "finished", self._name


if __name__ == '__main__':
    conns = []
    # all invalid addresses to see how they fail / check times
    conns.append(Connection("conn1", "www.2eg11erdhrtj.com"))
    conns.append(Connection("conn2", "www.e2ger2dh2rtj.com"))
    conns.append(Connection("conn3", "www.eg2de3rh1rtj.com"))
    conns.append(Connection("conn4", "www.ege2rh4rd1tj.com"))
    conns.append(Connection("conn5", "www.ege52drhrtj1.com"))

    for conn in conns:
        conn.start()
Run Code Online (Sandbox Code Playgroud)

我不知道超时的确切时间,但运行时会发生以下情况:

  1. 所有线程开始,我得到我的打印输出
  2. 每隔xx秒,一个线程显示完成,而不是一次完成
  3. 线程按顺序完成,而不是一次完成(超时=全部相同!)

所以我唯一的猜测是这与GIL有关吗?显然,线程不会同时执行任务,一次只能尝试一个连接.

有没有人知道这方面的方法?

(asyncore …

python multithreading network-programming

8
推荐指数
1
解决办法
3746
查看次数

多线程Python应用程序和套接字连接的问题

我正在研究在带有4G内存的Ubuntu机器上运行的Python应用程序的问题.该工具将用于审核服务器(我们更喜欢使用自己的工具).它使用线程连接到许多服务器,并且许多TCP连接失败.但是,如果我在开始每个线程之间添加1秒的延迟,那么大多数连接都会成功.我用这个简单的脚本来调查可能发生的事情:

#!/usr/bin/python

import sys
import socket
import threading
import time

class Scanner(threading.Thread):
    def __init__(self, host, port):
        threading.Thread.__init__(self)
        self.host = host
        self.port = port
        self.status = ""

    def run(self):
        self.sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sk.settimeout(20)
        try:
            self.sk.connect((self.host, self.port))
        except Exception, err:
            self.status = str(err)
        else:
            self.status = "connected"
        finally:
            self.sk.close()


def get_hostnames_list(filename):
    return open(filename).read().splitlines()

if (__name__ == "__main__"):
    hostnames_file = sys.argv[1]
    hosts_list = get_hostnames_list(hostnames_file)
    threads = []
    for host in hosts_list:
        #time.sleep(1)
        thread = Scanner(host, 443)
        threads.append(thread)
        thread.start()

    for thread in threads: …
Run Code Online (Sandbox Code Playgroud)

python sockets multithreading

8
推荐指数
2
解决办法
1万
查看次数