我的 main 函数中有以下代码:
def main():
server = socket.socket();
server.bind((address, port))
server.listen(1)
sock, addr = server.accept()
try:
while True:
message = sock.recv(buffer_size)
# Do some stuff...
sock.send(answer)
except KeyboardInterrupt:
pass
finally:
sock.close()
server.close()
Run Code Online (Sandbox Code Playgroud)
该程序运行得非常好,一切都很完美,直到我决定结束它。
Ctrl-C我使用(或^C)结束我的程序。异常KeyboardInterrupt得到正确处理并且到达了finally块,但是由于某种原因,当我再次运行程序时,我得到了OSError有关端口正在使用的信息,并且我必须等待大约1分钟,直到套接字关闭才可以重新运行代码。如果这很重要的话,我使用的是Linux。
我在这里缺少什么?为什么套接字没有正确关闭?
编辑:这不是如何关闭被杀死的程序打开的套接字的重复项?因为在我的例子中,套接字被优雅地关闭,而不是那个问题。
我有一个非常大的产品,期望来自itertools.product.
for result in product(items, repeat=9):
# stuff
Run Code Online (Sandbox Code Playgroud)
这需要花费很多时间,我正在寻找从某个项目开始的方法,因为我无法一次性完成.
我可以做以下事情:
gen = product(items, repeat=9):
for temp in gen:
if temp == DESIRED_VALUE:
break
for result in gen:
# stuff
Run Code Online (Sandbox Code Playgroud)
但这需要花费很多时间,就像我刚刚重启程序一样.那么,有没有办法"跳过去"而不浪费时间迭代整个事情?
我被教导如果你做malloc(),但你没有free(),内存将一直保持到重新启动.好吧,我当然测试了它.一个非常简单的代码:
#include <stdlib.h>
int main(void)
{
while (1) malloc(1000);
}
Run Code Online (Sandbox Code Playgroud)
我在任务管理器(Windows 8.1)中查看了它.
嗯,该程序真的很快就占用了2037.4 MB而且就这样.我知道它可能是Windows限制程序.
但这是奇怪的部分:当我关闭控制台时,内存使用百分比下降,即使我被教导它不应该!
免费呼叫是多余的,因为操作系统无论如何都要释放它?
(这里的问题是相关的,但不能完全回答我是否应该自由.)