为什么我的multiprocessing.Pool apply_async在for循环内只执行一次

问题描述

我正在尝试为网络安全项目编写爬虫,但是使用多处理方法的行为却很奇怪。

此方法应该做什么?,它会使用找到的查询参数列表遍历找到的目标网页。 对于每个网页,应将方法 phase1 (我的攻击逻辑)应用于与该页面相关的每个查询参数。

意思是,如果我有http://example.com/sub.php(将页面&secret作为查询参数)和http://example.com/s2.php(将topsecret作为参数),它应该执行以下操作:

根据 phase1 的时间和输出,我知道是否正在发生攻击。

实际发生的情况

仅执行第一次攻击。以下对apply_async的调用将被忽略。但是,它仍然在循环中循环,因为它仍然从上方打印for循环的输出。

这是怎么回事?为什么不触发攻击例程?我查找了用于多处理的文档,但这无助于解释这种现象。

一些有关相关问题的答案建议使用终止和联接,但这不是在这里隐式完成的,因为我使用的是with语句?

另外,这个问题(Multiprocessing pool 'apply_async' only seems to call function once)听起来很相似,但是与我的问题不同。与该问题相反,我没有问题,只有1个工作程序执行代码,但是我的X个工作程序仅产生了一次(而不是Y次)。

我尝试过的方法:将..池放入循环之外,但没有任何改变

有问题的方法如下:

def analyzeParam(siteparams,paysplit,victim2,verbose,depth,file,authcookie):
    result = {}
    subdir = parseUrl(viclist[0])
    for victim,paramlist in siteparams.items():
        sub = {}
        print("\n{0}[INFO]{1} param{4}|{2} Attacking {3}".format(color.RD,color.END + color.O,color.END,victim,color.END+color.RD))
        time.sleep(1.5)
        for param in paramlist:
            payloads = []
            nullbytes = []
            print("\n{0}[INFO]{1} param{4}|{2} Using {3}\n".format(color.RD,param,color.END+color.RD))
            time.sleep(1.5)
            with Pool(processes=processes) as pool:
                res = [pool.apply_async(phase1,args=(1,None,"",l,authcookie,)) for l in paysplit]
                for i in res:
                    #fetch results
                    tuples = i.get()
                    payloads += tuples[0]
                    nullbytes += tuples[1]
            sub[param] = (payloads,nullbytes)
            time.sleep(3)
        result[victim] = sub
    if not os.path.exists(cachedir+subdir):
        os.makedirs(cachedir+subdir)
    with open(cachedir+subdir+"spider-phase2.json","w+") as f:
        json.dump(result,f,sort_keys=True,indent=4)
    return result

一些技术信息:

  • Python版本:3.8.5
  • 我怀疑该错误位于 phase1 中,因为当在循环外使用Pool调用该错误时,它却多次执行。如果要查找,则源代码在这里:https://github.com/VainlyStrain/Vailyn

我该如何解决?谢谢!

解决方法

对于jasonharper来说,发现问题很赞!问题不在于上面的代码结构,而是变量paysplit,它是一个生成器,在第一次调用后就用尽了。

再次,感谢您指出!

最佳

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...