Seite 1 von 1

while schleife wartet nicht auf class

Verfasst: Montag 30. März 2009, 10:38
von bcit6k
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!

Verfasst: Montag 30. März 2009, 11:44
von rayo

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

Verfasst: Montag 30. März 2009, 11:45
von kbr
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.

Verfasst: Montag 30. März 2009, 13:52
von bcit6k
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!

Verfasst: Montag 30. März 2009, 16:36
von nuss
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.