如何解决为什么我的multiprocessing.Pool apply_async在for循环内只执行一次
我正在尝试为网络安全项目编写爬虫,但是使用多处理方法的行为却很奇怪。
此方法应该做什么?,它会使用找到的查询参数列表遍历找到的目标网页。 对于每个网页,应将方法 phase1 (我的攻击逻辑)应用于与该页面相关的每个查询参数。
意思是,如果我有http://example.com/sub.php(将页面&secret作为查询参数)和http://example.com/s2.php(将topsecret作为参数),它应该执行以下操作:
-
来自http://example.com/sub.php 的
- 攻击页面 从http://example.com/sub.php攻击
- 秘密 从http://example.com/s2.php 攻击
- 绝密
根据 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,它是一个生成器,在第一次调用后就用尽了。
再次,感谢您指出!
最佳
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。