while schleife wartet nicht auf class

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
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Montag 30. März 2009, 10:38

Hallo,

ich habe folgende aufgabenstellung zu lösen.

ich habe eine while schleife die nacheinander bestimmte urls mit urllib aufruft. bis die url geladen ist ( bzw antwortet) vergehen teilweise 12 minuten. ich dachte mir nun ich bau mir eine klasse die die url aufruft und eine zweite die chekct wie lange die url schon aufgerufen wird.
wird die url länger als 15 aufgerufen soll das skript das abbrechen.

ich habe das bis jetzt zum probieren mal so gelöst

Code: Alles auswählen

class openurl(threading.Thread):
	def __init__ (self):
		threading.Thread.__init__ (self)
		# # seconds for refreshing cpuload
		#write_to_log("# OPENURL Threat Start",0)
		class_check_openurl = check_openurl()
		class_check_openurl.start()
		self.loop = True
		
	def run(self):
		while self.loop:
			sleep(15)
			print "test"
			#url = 'someurl
			#page = urllib.urlopen(url)
			#pagedata = page.read()
			#return pagedata
			self.loop = False
		
	def __del__ (self):
		print "thread ended" 

Code: Alles auswählen

class check_openurl(threading.Thread):
	def __init__ (self):
		threading.Thread.__init__ (self)
		self.loop = True
		#seconds for refreshing cpuload
		self.refreshtime=1
		self.timeout = 15 # How long should the script wait
		self.countstart = 0
		print "CHECKSCRIPT START"
	
	def run(self):
		try:
			while self.loop:
				if(self.countstart > self.timeout):
					self.loop = False
				
				print self.countstart
				
				self.countstart = self.countstart + 1
				sleep(self.refreshtime)
		except:
			print "something went wrong"

Code: Alles auswählen

while not cursor.EOF:
	print cursor.fields[0]
	# # START THE CHECK SCRIPT
	
	# # OPEN THE URL FOR CACHING
	class_openurl =  openurl()
	class_openurl.start() #cursor.fields[0]

	
	cursor.MoveNext()
leider ist es so das die while schleife nie auf die klasse wartet, und ich weis nicht warum. hat jemand einen tipp für mich?

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

Montag 30. März 2009, 11:44

Code: Alles auswählen

import socket
import urllib2

# timeout in seconds
timeout = 15
socket.setdefaulttimeout(timeout)


# this call to urllib2.urlopen now uses the default timeout
# we have set in the socket module
req = urllib2.Request('http://www.voidspace.org.uk')
response = urllib2.urlopen(req)
Dieser Timeout reicht dir nicht?

Gruss
Benutzeravatar
kbr
User
Beiträge: 957
Registriert: Mittwoch 15. Oktober 2008, 09:27

Montag 30. März 2009, 11:45

Wenn ich das richtig sehe, startest Du in der while-Schleife stets einen neuen Thread, der dann wartet. Daher wartet die while-Schleife selbst nicht - das ist ja gerade der Sinn von Threads.
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Montag 30. März 2009, 13:52

ok, ich verstehe, ich hab mir inzwischen auch schon überlegt das ganze mit Queue zu machen. ist vieleicht der bessere weg

danke für den tipp!
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Montag 30. März 2009, 16:36

erstell doch einfach jedesmal, wenn du einen Thread öffnest einen timestamp, denn du an die klasse anhängst, dann kannst du einfach in regelmäßigen abständen für jeden thread die differenz zu jetzt ausrechnen.
Antworten