Python线程问题,这是对的吗?

时间:2016-08-28 18:04:47

标签: multithreading python-3.x asynchronous dns queue

我正在尝试进行几千次dns查询。我编写了我的脚本来使用python-adns。我试图添加线程和队列以确保脚本以最佳和有效的方式运行。

然而,我只能取得平庸的成绩。答复是不稳定/间歇性的。它们开始和停止,大多数时间停顿10到20秒。     tlock = threading.Lock()#printing to screen

def async_dns(i):

    s = adns.init()
    for i in names:

        tlock.acquire()

        q.put(s.synchronous(i, adns.rr.NS)[0])
        response = q.get()
        q.task_done()

        if response == 0:
            dot_net.append("Y")
            print(i + ", is Y")
        elif response == 300:
            dot_net.append("N")
            print(i + ", is N")

        tlock.release()


q = queue.Queue()

threads = []

for i in range(100):
    t = threading.Thread(target=async_dns, args=(i,))
    threads.append(t)
    t.start()
    print(threads)

我花了无数个小时。我很感激来自expeienced pythonista的一些意见。这是一个网络问题吗?通过切换服务器可以解决这个瓶颈/间歇性响应吗?

感谢。

1 个答案:

答案 0 :(得分:0)

如果没有问题的答案,我在上面的评论中问道,我不确定我能够很好地诊断你所看到的问题,但这里有一些想法:

  1. 看起来每个线程都在处理所有names而不只是处理它们的一部分。
  2. 你的Queue似乎什么也没做。
  3. 您的锁似乎保证您实际上一次只执行一个查询(违背拥有多个线程的目的)。
  4. 我建议您使用multiprocessing.pool.ThreadPool而不是尝试修复此代码吗?以下是一个完整的工作示例。 (如果您愿意,可以使用adns代替socket ...我无法轻松安装它,因此无法使用内置的socket。)

    在我的测试中,我有时也会看到停顿;我的假设是我在某个地方被扼杀了。

    import itertools
    from multiprocessing.pool import ThreadPool
    import socket
    import string
    
    def is_available(host):
        print('Testing {}'.format(host))
        try:
            socket.gethostbyname(host)
            return False
        except socket.gaierror:
            return True
    
    # Test the first 1000 three-letter .com hosts
    hosts = [''.join(tla) + '.com' for tla in itertools.permutations(string.ascii_lowercase, 3)][:1000]
    
    with ThreadPool(100) as p:
        results = p.map(is_available, hosts)
    
    for host, available in zip(hosts, results):
        print('{} is {}'.format(host, 'available' if available else 'not available'))