使用Python中的线程和队列遍历多个文件

时间:2019-05-19 20:50:13

标签: python multithreading queue

我很难通过添加线程来扩展脚本。我正在为某事编写模糊测试程序,并决定实现queue,该功能可与threading一起使用。该脚本接受带有模糊请求的文件,插入点以%__v__%分隔。以及有效载荷文件。

例如,假设使用以下两个文件作为输入:

requests_file

Test1: %__v__%
Test2: %__v__%
Test3: %__v__%
Test4: %__v__%
Test5: %__v__%

有效载荷文件

1
2
3
4
5

该脚本应发出如下请求,并迭代所有可能性:

Test1: 1
Test1: 2
Test1: 3
Test1: 4
Test1: 5
Test2: 1
Test2: 2
Test2: 3
...
etc.

我知道可以使用for循环来实现,而无需队列,也不需要线程,但是比使用线程要慢。我打算将其用于一些非常大的文件,并在收到的内容中进行一些处理。

我尝试了很多事情,显然我只是不了解线程/队列的工作方式。到目前为止,我的输出接近以下内容:

Test1: 1
Test1: 1
Test1: 1
Test1: 1
Test1: 1
Test1: 2
Test1: 2
Test1: 2
Test1: 2
Test1: 2
...

然后,它最终到达Test1: 5并通过快速发送Test2-Test5来完成,就像这样:

Test2: 1
Test3: 1
Test4: 1
Test5: 1

这是我尝试过的例子。如果我有一个request_file和一个payload_file,我会执行以下操作:

import threading
import queue

threads = 5
def build_wordlist(input_file):
    <queue building logic>
    return queue

def send(payloads_queue, requests_file):
    while not payloads_queue.empty():
        p = payload_queue.get()
        with open(requests_file) as fin:
            for r in fin:
                <send logic>

payloads_queue = build_wordlist('payloads.txt')

for i in range(threads):
    t = threading.Thread(target=send, args=(payloads_queue,requests_file))
    t.start()

我也尝试了与上述相反的方法-并得到了类似的结果:

import threading
import queue

threads = 5

def build_wordlist(input_file):
    <queue building logic>
    return queue

def send(requests_queue, payloads_file):
    while not requests_queue.empty():
        r = requests_queue.get()
        with open(payloads_file) as fin:
            for r in fin:
                <send logic>

requests_queue = build_wordlist('requests.txt')

for i in range(threads):
    t = threading.Thread(target=send, args=(requests_queue, payloads_file))
    t.start()

我尝试过的另一件事是调用线程并传入全局列表和队列。使用与上述相同的queue.get()逻辑,我尝试在全局列表上使用list.pop()为每个线程弹出一个值。像这样:

global payloads
payloads = []

def build_wordlist(input_file):
    <queue building logic>
    return queue

with open(payload_File) as fin:
    for payload in fin:
        payloads += payload

def send(rq, p):
    while not request_queue.empty():
        request = request_queue.get()
        <send logic>

requests_queue = build_wordlist('requests.txt')

while len(payloads) != 0:
    payload = payloads.pop()

    for i in range(threads):
        t = threading.Thread(target=send, args=(request_queue, payload))
        t.start()

我还尝试通过将两个文件都加载到队列中并对其进行迭代来遍历两个队列,以在第一个队列为空时获得类似的结果。

这使我疯狂,因为无需线程迭代即可轻松实现。抱歉,很长的帖子,这可能是一个简单的答案,我正在忽略某些内容,但是现在这没有任何意义。

无论如何,如果您需要更多信息,请告诉我。我并没有真正复制粘贴当前代码,但这与我提供的示例极为相似。

谢谢。

0 个答案:

没有答案