【问题标题】:How to avoid program freezing when connecting to server连接服务器时如何避免程序冻结
【发布时间】:2015-08-06 05:58:36
【问题描述】:

我有一个小脚本可以过滤那些尚未注册的域名。我使用 pywhois 模块。问题是它在几个(有时数百个)请求后突然冻结并且什么都不做。我认为这不是禁令,因为我可以在冻结后立即运行程序并且它可以工作。

我想避免这种冻结。我的想法是计算函数的运行时间,如果时间跨过某条线(例如 10 秒),它会重复代码。

您对如何避免冻结有什么建议吗?还是检查域的更好方法?

代码如下:

for keyword in keywords:
        try:
            details = pythonwhois.get_whois(keyword+'.com')
        except Exception as e:
            print e
            continue
        if 'status' not in details.keys():
            print 'Free domain!'
            print keyword

【问题讨论】:

  • 可以在for循环开始时添加time.sleep
  • @Ajay 问题可能不是加载,而是注册的域名服务器响应不正确。
  • @JDong 你知道如何跳转到下一个关键字吗?谢谢
  • 当线程可以派上用场时,这是一种问题,因为您可以异步运行您的 whois 查找而不会阻塞程序的其余部分。
  • @mpursuit 整个程序只是查找,你怎么看?我应该为每个关键字创建新线程还是?谢谢

标签: python connection whois pywhois


【解决方案1】:

此方法容易更改(如果底层库更改),但是您可以调用内部套接字函数为所有 pythonwhois 网络调用设置超时。例如:

TIMEOUT = 5.0 # timeout in seconds
pythonwhois.net.socket.setdefaulttimeout(TIMEOUT)
pythonwhois.get_whois("example.com")

【讨论】:

  • 非常感谢你们!这是我一直在寻找的解决方案。
【解决方案2】:

也许你可以试试 dnspython。看起来您只是想检查一个域名是否已注册。例如:

import dns.resolver

for keyword in keywords:
    try:
        dns.resolver.query(keyword+'.com')
    except dns.resolver.NXDOMAIN:
        print(keyword+'.com is available!')

DNS 解析器的默认超时时间为 2 秒。如果你想改变它,你可以用不同的timeout 创建一个dns.resolver.Resolver 的新实例。

要使其成为多线程,如果可以使用python3,线程池将是最佳选择:

from multiprocessing import Pool

def check_keyword(keyword):
    try:
        dns.resolver.query(keyword+'.com')
    except dns.resolver.NXDOMAIN:
        # You probably want to change this to a return
        print(keyword+'.com is available!') 

if __name__ == '__main__':
    keywords = [...]
    p = Pool(5)
    print(p.map(check_keyword, keywords))

【讨论】:

  • 感谢您的回复,但这不能正常工作。例如 321000.com 据说还没有注册,但它已经注册了。
  • 嗯,看来您必须使用whois。我将寻找一个带有超时的 whois python 库。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多