我使用manage.py命令创建大约200个线程来检查远程主机.我的数据库设置允许我使用120个连接,所以我需要使用某种池.我尝试过使用分离的线程,就像这样
class Pool(Thread):
def __init__(self):
Thread.__init__(self)
self.semaphore = threading.BoundedSemaphore(10)
def give(self, trackers):
self.semaphore.acquire()
data = ... some ORM (not lazy, query triggered here) ...
self.semaphore.release()
return data
Run Code Online (Sandbox Code Playgroud)
我将此对象的实例传递给每个检查线程,但在初始化120个线程后,仍然在Pool对象内部获得"OperationalError:FATAL:抱歉,已经有太多客户端"了.我预计只会打开10个数据库连接,线程将等待免费的信号量插槽.我可以通过注释"release()"来检查信号量的工作原理,在这种情况下,只有10个线程可以工作,其他线程将等到应用程序终止.
据我所知,即使实际调用在不同的线程内,每个线程都会打开与数据库的新连接,但为什么呢?有没有办法只在一个线程内执行所有数据库查询?
我正在为MIPS架构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如"如果这个操作码是lui而下一个操作码是addiu然后返回var = value "或"如果这个操作码是bne,它指的是当前的地址 - 创建循环解析树中的定义".问题 - 有很多这样的规则,我找不到定义它们的好方法.我尝试为每个规则编写分离的函数,定义好的OOP基础逻辑类并扩展它们来创建规则,甚至尝试了令人沮丧的代码的正则表达式(令我惊讶的是这比预期更好)但无论我尝试过什么,我的代码很快变得很大,难以阅读,无论我试图记录和结构如何它.
这让我得出结论,我试图通过使用错误的工具来解决这个任务(更不用说对于这样复杂的任务来说太愚蠢:)),但我不知道应该尝试什么.目前我有两个未经考虑的想法,一个是使用某种DSL(我完全没有这方面的经验,所以我可能完全错了),另一个是编写某种类似二进制regexp的工具用于操作码匹配.
我希望有人可以指出我正确的方向,谢谢.
我处理apllication,它允许插件访问不同的功能集,每个插件都提供"初始化字符串",用于设置对不同功能的访问级别.开发人员向我发送此字符串,并使用我的1024位RSA私钥对其进行加密,然后将编码数据发回.启动时,我的应用程序使用内置公钥解码编码数据(编码初始化字符串),如果"解码数据!=初始化字符串"则无法启动.
那么,是否可以使用"初始化字符串"=>"编码初始化字符串"(从其他插件中提取)的数据库来破解我的私钥,或者可以在合理的时间内强制它?
我正在查看 C 应用程序的一个非常可疑的反汇编 MIPS 代码
80019B90 jal loc_80032EB4
Run Code Online (Sandbox Code Playgroud)
loc_80032EB4 在另一个函数体的中间,我特别检查了在运行时没有在这个地址加载其他代码,并且以这种方式调用该函数(在开始时传递一些代码)可能很有用。但是在 C 中怎么做呢?它不是 goto,因为您不能转到另一个函数,并且正常的函数调用将始终“jal”到开头。这可以是一些手动优化吗?
更新:
两个函数的简化布局,被调用者:
sub_80032E88 (lz77_decode)
... save registers ...
80032E90 addiu $sp, -8
... allocate memory for decompressed data ...
80032EB0 move DECOMPRESSED_DATA_POINTER_A1, $v0
loc_80032EB4:
80032EB4 lw $t7, 0(PACKED_DATA_POINTER_A0)
... actual data decompression ...
80032F4C jr $ra
Run Code Online (Sandbox Code Playgroud)
呼叫者:
80019ACC addiu $sp, -0x30
... some not related code ...
80019B88 lw $a1, off_80018084 // A predefined buffer is used instead of allocating it for decompressed data
80019B90 jal loc_80032EB4 …Run Code Online (Sandbox Code Playgroud) 我有以下asm MIPS代码:
80031DB8 bnez $v0, loc_80031F58
80031DBC move $v0, $zero
Run Code Online (Sandbox Code Playgroud)
据我所知,"分支不等于零"永远不会跳转到loc_80031F58,因为v0 = 0,是吗?
mips ×3
disassembly ×2
assembly ×1
control-flow ×1
decompiling ×1
django ×1
opcode ×1
orm ×1
postgresql ×1
rsa ×1
security ×1