[PYTHON] Hilos

Iniciado por EvilGoblin, 8 Julio 2010, 18:30 PM

0 Miembros y 1 Visitante están viendo este tema.

EvilGoblin

Estoy "practicando" hilos en Python para ganar velocidad en algunas actividades

entonces me doy cuenta que no pueden acceder al mismo recurso los 2 hilos al a vez (cosa que no pasa en C++)

ejemplo:


import time
from threading import Thread

id = 1
class Hilo( Thread ):

def __init__( self, num, nom ):

Thread.__init__(self)
self.dato = num
self.nombre = nom

def run( self ):
for l in range( 10 ):
print( self.nombre + " ID " + str( id ) )
id = id + 1
def test():
hilo1 = Hilo( 1, "Hilo 1" )
hilo2 = Hilo( 2, "Hilo 2" )
hilo2.start()
hilo1.start()
hilo1.join()
hilo2.join()

if __name__ == "__main__":
test()



Me da error al acceder al ID el segundo hilo

entonces queria consultar que forma tengo de acceder a una variable, que pueda actualizarla desde varios hilos

como agregar cadenas en un array.  

Experimental Serial Lain [Linux User]

bizco

busca sobre sincronizacion de threads, esto es lo correcto sea el lenguaje que sea.

Novlucker

De aquí aprendí yo sobre threads :P, vete directo a la parte de "Sincronización" que lo tiene muy bien explicado

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

EvilGoblin

yo justo estaba leyendo
http://chuwiki.chuidiang.org/index.php?title=Hilos_en_python

que tmb explican bien, ahora reviso tu link. asi me queda mas claro

Estaba intentando la sincronizacion, es bastante alboroto xD.. espero q me quede un poco mas en claro

Igual no necesito hacer nada de semaforos, ni nada raro. Ya que van a ser tareas simples, Pero que con varios hilos las hago bastante mas rapido


ya encontre la solucion era usar


global id

para poder modificarlo desde el hilo =P

Suerte!
y Gracias!
Experimental Serial Lain [Linux User]

Novlucker

#4
Ok, pero poner una variable global no va a impedir que pueda haber errores si los dos hilos intentan acceder a la misma vez :-\

Las variables globales, son iguales por ejemplo a las static de otros lenguajes, son variables independientes de un objeto, pero solo eso.

En defintiva, para esta función que estas haciendo no hay problemas, pero si pones los hilos a hacer algo más "trabajoso" puede que te de problemas en la sincronización.

Trata con más hilos y más repeticiones en el contador y verás
Código (dos) [Seleccionar]
Hilo 3 ID 272
Hilo 3 ID 273
Hilo 3 ID 274
Hilo 5 ID 275
Hilo 5 ID 276
Hilo 5 ID 277
Hilo 5 ID 278Hilo 4 ID 272
Hilo 4 ID 273
Hilo 4 ID 274
Hilo 4 ID 275Hilo 3 ID 275
Hilo 3 ID 276


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

EvilGoblin

Ok, igual estoy leyendo sobre los semaforos y sincronizacion xD

Mi idea es esto

Si creo un bruteforce para SQL (blind)

poner a crackear 1 x 1 letra por letra. tardaria bastante, mi intencion es usar hilos para poder crackear todas las letras a la vez

asi que solo voy a usar algunos variables para saber si termino y escribir un array asi que no creo que tenga muchos problemas.

Lo hago yo para aprender y tener mas control sobre lo q hago. ^^
Experimental Serial Lain [Linux User]

Novlucker

Esta bien, yo te lo decía para que lo tengas presente, ya que si no le pones control a los diferentes hilos, "el que entra primero gana", entonces puede que no estes donde crees que estas :P

Sobre tu código, supongo que te refieres a ir generando las "claves" y hacer GET a la web, porque es más rápido hacer GET con muchos hilos, que hacerlo con solo uno :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

EvilGoblin

Claro,
son varios los q estoy haciendo

uno que haga un GET otro POST otro User-agent

estoy probando varios ^^, solo para taradear, no saco info. Estoy probando las limitaciones de esta tecnica
Experimental Serial Lain [Linux User]

Debci

En java sonde esas cosas que son correctas, pero si no lo haces, no se nota en aplicaciones "normales" pero como compliques un poco la historia ocurren cosas extrañas xD

Saludos

hackstyle18

prueba poner esta parte asin:


        hilo1 = Hilo( 1, "Hilo 1" )
hilo2 = Hilo( 2, "Hilo 2" )
hilo2.start()
hilo2.join()
hilo1.start()



lo que ace el join() es que asta que no termine un thread  en este caso el hilo2, no deja que empieze el hilo1 , asin creo que no te tiene que dar error porke no intentaran acceder los 2 al mismo tiempo ;)

nose si me equivoko o no, yo soy novato en esto tambien ^^

Saludos