我已经在python中做了一个ip +端口检查器,但是我想用django使其成为一个网站,一切都还可以,但是我有一些问题,我不知道如何制作,所以它没有创建一个无限循环,如果将1000个ip +端口添加到数据库中,我不希望它一次建立1000个连接。
我没有尝试太多,因为我不知道该怎么做。
我尝试使用from concurrent.futures import ThreadPoolExecutor
并将max_workors设置为10,因此它一次只能进行10个连接,但这虽然可行,但仍然存在邀请循环的问题。
模型保存功能
def save(self, *args, **kwargs): # overwrite save function
super().save(*args, **kwargs) # saves to database
checker.check(self) # calls check function
checker.py中的检查功能
def check(modelthing):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((self.ip, self.port))
modelthing.is_alive = True # sets is_alive to true if everything went ok
except:
modelthing.is_alive = False # sets is_alive false when exception is thrown
modelthing.save() # ISSUE it saves the model again and it calls the save function that calls checker.check(self) witch creates an infinity loop
将其保存到数据库,调用检查功能。 (第一段代码) 然后,它检查ip +端口是否仍然有效。 (第二个代码块),最后一行再次保存它,女巫调用了第一个代码块,然后该块再次调用了checker函数,并一遍又一遍地重复。
我不知道这是否是最好的方法,但我设法使其与ThreadPoolExecutor一起使用,虽然解决了第二个问题,但仍然会产生无限循环。
答案 0 :(得分:0)
您可以使用依赖注入,在call_check
中传递一个附加的关键字参数(例如save
),以决定是否需要再次调用checker.check(self)
:< / p>
def save(self, *args, call_check=True, **kwargs):
super().save(*args, **kwargs)
if call_check:
checker.check(self)
然后在checker.check
中将参数值传递为False
:
def check(modelthing):
...
...
modelthing.save(call_check=False)
答案 1 :(得分:0)
一种解决方案是从checker.check(self)
函数中删除save
,然后在保存对象后分别调用它。
因此,在您的应用程序代码中,您可以执行以下操作: