繁体   English   中英

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

[英]Why is my multiprocessing.Pool apply_async only executed once inside a for loop

我正在尝试为 web 安全项目编写爬虫,并且使用多处理的方法出现了奇怪的行为。

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

Meaning, if I have http://example.com/sub.php , having page &secret as query parameters, and http://example.com/s2.php , having topsecret as parameter, it should do the following:

我知道是否发生了攻击,基于时间和 phase1 的output

实际发生了什么

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

这里出了什么问题? 为什么没有触发攻击例程? 我查看了多处理的文档,但这无助于解释这种现象。

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

另外,这个问题( 多处理池'apply_async'似乎只调用一次function )听起来很相似,但与我的问题不同。 与那个问题相反,我不存在只有 1 个工作人员执行代码的问题,但我的 X 个工作人员只产生了一次(而不是 Y 次)。

我尝试过的:将 with..Pool 放在循环之外,但没有任何改变

有问题的方法如下:

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, color.END + color.O, color.END, param, color.END+color.RD))
            time.sleep(1.5)
            with Pool(processes=processes) as pool:
                res = [pool.apply_async(phase1, args=(1,victim,victim2,param,None,"",verbose,depth,l,file,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。 这是一台发电机,在第一次通话后就筋疲力尽了。

再次感谢您的指出!

最好的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM