filhandles und vieeele threads

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ich schreib grad einen programm, wo ca 300 threads ca jede 10 secunden ca 1 kb data in einer datei schreiben muessen^^

obwohl python mir keine fehlermeldungen gibt klappt es nicht.
wie muss ich die sache also angehen? (oder ist windoof dafür einfach zu "schwach")
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Sorry aber für was brauchst du bitte 300 Threads?
Reicht es nicht die 300 Dateien nacheinander zu schreiben?
In 10 Sekunden wird der PC sicher 300kb auf die Festplatte schreiben.

Gruss
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

es wird ja alles in einer einzigen datei gescrieben,

vieleicht nochmal genaueres zum prob:
die data wird nur unvolsändig in der datei gescrieben. und ich hab das so gemacht, dass ich für jeden thread einen neuen filehandle aufgemacht wird
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Das ist nicht gerade eine gute Idee. Kannst du nicht einen Thread machen, der das Filehandle offen hält und die Daten von den anderen Threads entgegennimmt?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Und wieso brauchst du 300 Threads?

Kann nicht 1 Thread die Daten entgegen nehmen und in die Datei schreiben?

Beschreibe doch dein Problem mal genauer ... Was willst du erreichen und woher stammen die Daten.

Gruss
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ich denke, der quelltext sagt mehr als tausend worte...
(is ziemlich lange her das ichs geschrieben habe, kleinere bugs sind also nicht auszuschliesen)

Code: Alles auswählen


from time import sleep
import threading
import socket
from urlparse import urlparse
from random import randrange

def mkq():
	a = "123a4e56i7a890poiuaieztraeewiaqasdfghjkilmanbevcxy"
	ges = ""
	for i in range(randrange(5)+3):
		ges += a[randrange(len(a[:-1])+1)]
	return ges

def rmTwice(resp):
	resp = dict(zip(resp, resp)).keys()
	return resp

	
def filter(resp):
	index = 0
	l1 = []
	l2 = []
	urls = []
	while index is not -1:
		index = resp.find('<a class=l', index + 1)
		l1.append(index)
		l2 = []
	for i in range(len(l1)):
		index = resp.find('">', l1[i])
		l2.append(index)
	for i in range(len(l1) - 1): # spaeter nachgicken wegen den -1.......
		match = resp[l1[i]:l2[i]].replace('<a class=l href=', '').replace('"', '')
		url = urlparse(match)[1]
		urls.append(url)
	return urls

	
	
def scan(resp):
	ftps = ""
	for host in resp:
		try:
			s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s2.settimeout(1)
			s2.connect((host, 21))
			resp2 = s2.recv(128)
			print host, ":\n", resp2
			if resp2: ftps += host + ':\n' + resp2 + '\n--=000000=--\n'
		except:
			pass
	#print "writing in file..."
	f.write(ftps)

	
def google():
	global f
	f = open('ftpsLog.txt', 'a')
	while 1:
		jetzt = True
		start = 0
		B = "foobar"
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.connect(('www.google.pl', 80))
		keyword = mkq()
		while 1:
			#print "sending google req: GET /search?num=100&start=" + str(start) + "&q=" + keyword + " HTTP/1.1"
			s.send("GET /search?num=100&start=" + str(start) + "&q=" + keyword + " HTTP/1.1\n")
			s.send('Host: www.google.pl')
			s.send('\n\n')
			start += 100
			resp = ""
			while not '</html>' in resp:
				resp += s.recv(1024)
			resp = filter(resp)
			if jetzt:
				A = resp[:20]
			else:
				B = resp[:20]
			jetzt = not jetzt
			if not A == B:
				resp = rmTwice(resp)
				#print len(resp), "hosts wurden gefunden"
				scan(resp)
			else:
				start = 0
				break
	
for i in range(1000):
	t = threading.Thread(target = google)
	t.setDaemon(1)
	t.start()
	#t.join()
	#print "thread wurde gesteratet"
	sleep(0.1)
print 'ende mit mking threads'


try:
	while 1:
		sleep(100)
except:
	f.close()
		
		




danke für die mühe :lol:
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Ist das richtig, dass du einfach 1000 Google-Anfragen mit zufälligen Suchbegriffen die URLs herauslesen willst und dann diese URLs öffnest und den Inhalt in eine Datei speicherst?

Hab ich es richtig verstanden?

Da gibts einige bessere Methoden sowas zu erledigen.

Ich würde jetzt z.B. so machen:
1 Thread, der die Google-Anfragen startet (mit der URL-Lib, nicht mit sockets) und dann die URLs via eine Queue an den 2. Thread schickt und dieser alle URLs öffnet und die Daten in eine Datei speichert.

Dann hast du gerade mal 2 Threads, die dauernd URL-Anfragen starten.

Gruss
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich habe gute Erfahrungen mit Mark Pilgrims PyGoogle gemacht. Damit kannst du aber nicht massenweise Anfragen stellen, sondern bist auf einige Tausend pro Tag beschränkt (mit dem kostenlosen Entwickler-Key).
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

bezogen auf rayos antwort:
nicht ganz, es sind nicht 1000, sondern 1000 while 1 anfragen die geschickt werden ( ;. danach werden die urls nicht geöffnet (nehme an das du damit http get meinst), sondern der ftp banner wird gelogt. (wobei das erfolgreiche logen des ftp banners nicht mein endziel sondern nur ein zwischenschritt ist)

zwei threads waeren zu wenig und zwei thread gruppen (sozusagen get und scan) waere glaub ich ziemlich schwierig zu organizieren und zu unflexibel



ich krieg jetzt aber in den nächsten tagen endlich mein eigenes pc, wo ich naturlich was *NIXes draufpacke, und nehme an das es dan klappen müsste


edit{
Das ist nicht gerade eine gute Idee. Kannst du nicht einen Thread machen, der das Filehandle offen hält und die Daten von den anderen Threads entgegennimmt?
hey! natürlich, hatte dies voher irgendwie überlesen, aber so muüsste es eigentlich klappen

thx
}
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Was ist ein FTP-Banner? Die ersten 128 Byte des Headers einer Website?

Irgendwie seh ich es nicht ein warum du 1000 gleichzeitige Anfragen starten willst und nicht z.B. 10?

Gruss
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

rayo hat geschrieben:Was ist ein FTP-Banner?
Das ist der Begrüßungsstring eines FTP-Servers, der in der Regel den Namen und die Version der Serversoftware enthält.

Wieso genau der in diesem Zusammenhang relevant ist, verschließt sich mir bisher aber.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Also sucht das Programm einfach FTP-Servers und die Software auf der er läuft?

Für was sollte das gut sein? Zum verwundbare Server finden?

Gruss
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

mist, ich krieg das einfach nicht hin, ich weis nicht wie ich eine variable (die mit den zu schreibende hosts), zwischen allen threads sharen soll. Ich dachte immer ich müsste die variable erst deklarieren und dan in den thread als global setzen, funzt aber nicht. any ideas?
ür was sollte das gut sein? Zum verwundbare Server finden?
ursprünglich ja, hab diese fase aber schon hinter mir gelassen :D
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

eine idee wäre eine klasse mit self.variable...
eine andere, eine liste oder ein dictionairy zu benutzen...
http://www.cs.unm.edu/~dlchao/flake/doom/
BlackJack

Die Kommunikation sollte am besten über `Queue.Queue` Objekte abwickeln, die sind threadsafe. Und diese kann man über die `__init__()` Methode an die Threads übergeben.
Antworten