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
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:
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 utilizandoread_lines
, luego recorre esas líneas y llama aemail_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.