相关疑难解决方法(0)

多线程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万
查看次数

Python asyncio强制超时

使用asyncio可以在超时时执行协程,以便在超时后取消:

@asyncio.coroutine
def coro():
    yield from asyncio.sleep(10)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait_for(coro(), 5))
Run Code Online (Sandbox Code Playgroud)

上面的示例按预期工作(它在5秒后超时).

但是,当协程不使用asyncio.sleep()(或其他asyncio协同程序)时,它似乎没有超时.例:

@asyncio.coroutine
def coro():
    import time
    time.sleep(10)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait_for(coro(), 1))
Run Code Online (Sandbox Code Playgroud)

运行时间超过10秒,因为time.sleep(10)未取消.在这种情况下是否可以强制取消协程?

如果应该使用asyncio来解决这个问题,我该怎么做?

python python-asyncio

7
推荐指数
1
解决办法
9456
查看次数

标签 统计

python ×2

multithreading ×1

python-asyncio ×1

sockets ×1