es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hilos leyendo la misma línea de un archivo.

Estoy intentando usar threads con Python, soy bastante nuevo en threads. Quería que los threads leyeran líneas aleatorias del mismo archivo pero todos los threads leen la misma línea. Entonces el archivo que estoy intentando leer tiene todas las líneas en formato email:pass:otra_línea. Esperaba leer diferentes líneas del mismo archivo con múltiples threads pero está leyendo la misma línea con múltiples threads.

Por ejemplo, un thread devolverá línea1, el segundo thread devolverá línea2 pero son líneas aleatorias.

import random
import threading

def email_pass_token():
    global email, pass2, token

file = open("testing/pokens.csv").read().splitlines()
acc_str = random.choice(file)

num_lines = sum(1 for _ in file)
print(num_lines)

email = ":".join(acc_str.split(":", 1)[:1])

pass2 = ":".join(acc_str.split(":", 2)[:2][1:])

token = ":".join(acc_str.split(":", 3)[:3][2:])

email_pass_token()

def gen_acc():
    print(email, pass2, token)

threads = []
num_thread = input("Threads: ")
num_thread = int(num_thread)
for i in range(num_thread):
    t = threading.Thread(target=gen_acc)
    threads.append(t)
    t.start()

Ejemplo de archivo:

tqqe435ihwbta@oncemail.co.kr:#354946345e696$e30417:otra_línea1
tkbzw543vwxzn@oncemail.co.kr:2e5548c543709!8@305-8(:otra_línea2
jcgeau43yphr@oncemail.co.kr:41c!954=7543cc^1#48fd_$
b5:otra_línea3
bqajs543qlqys@oncemail.co.kr:1f@e54d78^feb54355&6$50:otra_línea4
tqqeihw54bta@oncemail.co.kr:#3946345e696$e30417:otra_línea5
tkbzwvwx543zn@oncemail.co.kr:2e58c5437709!8@305-8(:otra_línea6
jcgeauy453phr@oncemail.co.kr:41c!9=7543cc^1#48fd_$
b5:otra_línea7
bqajsqlq54ys@oncemail.co.kr:1f@ed78^feb53455&6$50:otra_línea8

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código actual es que cada hilo está accediendo al mismo archivo al mismo tiempo y, por lo tanto, leyendo la misma línea. Para que cada hilo lea una línea diferente, el archivo debe dividirse en segmentos iguales y cada hilo debe leer desde un segmento específico.

    Aquí hay una solución de ejemplo:

    import random
    import threading
    
    # función para leer líneas específicas del archivo
    def read_lines(file, start, end):
        lines = []
        with open(file) as f:
            for i, line in enumerate(f):
                if i >= start and i < end:
                    lines.append(line.strip()) # eliminar el carácter de nueva línea
        return lines
    
    # función para generar correo electrónico, contraseña, token
    def email_pass_token(line):
        global email, pass2, token
    
        acc_str = line.split(":")
        email = acc_str[0]
        pass2 = acc_str[1]
        token = acc_str[2]
    
    # función para que cada hilo ejecute
    def gen_acc(start, end):
        lines = read_lines("testing/pokens.csv", start, end)
        for line in lines:
            email_pass_token(line)
            print(email, pass2, token)
    
    # obtener el número de líneas en el archivo
    with open("testing/pokens.csv") as f:
        num_lines = sum(1 for _ in f)
    
    threads = []
    num_thread = input("Hilos: ")
    num_thread = int(num_thread)
    lines_per_thread = num_lines // num_thread
    
    # crear y arrancar hilos
    for i in range(num_thread):
        start = i * lines_per_thread
        end = start + lines_per_thread
        if i == num_thread - 1: # el último hilo obtiene las líneas restantes
            end = num_lines
        t = threading.Thread(target=gen_acc, args=(start, end))
        threads.append(t)
        t.start()
    
    # esperar a que los hilos terminen
    for t in threads:
        t.join()
    

    En esta solución, la función read_lines lee líneas específicas del archivo según los índices de inicio y finalización que se pasan como argumentos. Se da a cada hilo un rango específico de líneas para leer, por lo que no hay superposición entre hilos.

    La función email_pass_token toma una sola línea del archivo y la divide en variables de correo electrónico, contraseña y token.

    La función gen_acc toma un índice de inicio y finalización y lee las líneas correspondientes del archivo utilizando read_lines, luego recorre esas líneas y llama a email_pass_token en cada una.

    La parte principal del código obtiene el número total de líneas en el archivo, calcula el número de líneas que cada hilo debe leer, crea y arranca los hilos con sus rangos de líneas específicos. Finalmente, el código espera a que todos los hilos terminen antes de salir.

    Tenga en cuenta que esta solución asume que el número de líneas en el archivo es divisible de manera uniforme por el número de hilos. Si no es así, el último hilo obtendrá las líneas restantes.

Comments are closed.