在作用域外从Multiprocessing Manager传递结果列表



我正试图扫描域进行渗透测试,程序使用Multiprocessing与结果列表从进程传递;返回主函数

我试图在class中也使用global中提到的全局变量。使用这个提醒我,进程位于不同的内存中。所以我用manager.list()代替;在进程之间共享内存

这是我尝试过的:

from multiprocessing import Process, cpu_count, Manager
class variably:
variably=bla..
.... 
def engine(domainlist, R):
for domain in domainlist:
try:
r = requests.get("http://" + domain, headers=headers, timeout=0.7, allow_redirects=False)
if r.status_code == expected_response:
print("Success" + domain)
print(domain, file=open("LazyWritesForDebugPurposes.txt", "a"))
R.append(str(domain))
elif r.status_code != expected_response:
print("Failed" + domain + str(r.status_code))
except:
pass
def fromtext():
....
R = []
with Manager() as manager:
num_cpus = cpu_count()
processes = []
R = manager.list()
for process_num in range(num_cpus):
section = domainlist[process_num::num_cpus]
p = Process(target=engine, args=(section,R,))
p.start()
processes.append(p)
for p in processes:
p.join()
print(R)
print(R)
print("")
print(" Total of Domains Queried : "  + colors.RED_BG + " "+str(len(R)) +" "+ colors.ENDC)
if len(inf.result_success) >= 0:
print(" Successfull Result : " + colors.GREEN_BG + " "+str(len(R))+ " "+colors.ENDC)
fromtext()

抱歉任何无效的语法或缩进,试图将代码简化为更短的代码片段。

以上代码返回BrokenPipe,有时ConnectionRefused错误。从异常中,我可以看到列表已经附加为:['Domain.com','Domain_2.com'],但不知何故引发了一个异常。

下面是一些关于这个问题的截图:有问题的截图

<标题>

编辑:看起来列表只能在manager()范围内传递,我如何扩展在范围外传递的数据,例如在不同的函数中调用列表。下面的代码可以工作:

with Manager() as manager:
num_cpus = cpu_count()
processes = []
R = manager.list()
for process_num in range(num_cpus):
section = domainlist[process_num::num_cpus]
p = Process(target=engine, args=(section,R,))
p.start()
processes.append(p)
for p in processes:
p.join()
str(len(R))

您确实需要使用队列。在主线程中创建一个multiprocessing.SimpleQueue,并将其传递给所有子进程。他们可以向这个队列添加项目。

创建自己的管理器几乎总是一个错误。

问题是,我必须通过设置一个新变量显式地将manager.list()转换为另一个正常列表,并使用global使其在另一个函数中可用。我知道它很脏,没有尝试使用Queue(),但现在,至少它是工作的。

def executor():
global R
.... 
with Manager() as manager:
num_cpus = cpu_count()
processes = []
R = manager.list()
for process_num in range(num_cpus):
section = domainlist[process_num::num_cpus]
p = Process(target=engine, args=(section,R,))
p.start()
processes.append(p)
for p in processes:
p.join()
R = list(R)
print(R)

如果能简化一下,我将非常感激。

相关内容

  • 没有找到相关文章

最新更新