[Tutor] Python threads

tpc at csua.berkeley.edu tpc at csua.berkeley.edu
Wed Jun 9 18:54:51 EDT 2004


hi everybody,
I have created a function called determinePlaytimeInSeconds that, given a
tuple of, say, 20 tuples consisting of filename and URI:

(('filename01', 'http://hostname/audio/filename01.mp3'), ('filename02',
'http://hostname/audio/filename02.mp3'), ('filename03',
'http://hostname/video/filename03.wmv'), etc...)

passes each tuple to a threaded class called FileReader.  However,
for some unknown reason, when I run the script I sometimes (though not
always) get a strange error message:

AttributeError: 'FileReader' object has no attribute 'playtimeInSeconds'
or
AttributeError: 'FileReader' object has no attribute 'fileType'

I somehow think this error has something to do with the thread not
sleeping; however, when I don't comment out the activeCount and sleep
code, the script just hangs.  I used the example code at:

http://starship.python.net/crew/aahz/OSCON2000/SCRIPT3.HTM

What am I doing wrong ?

<code>
import urllib
from threading import Thread
from threading import activeCount
from time import sleep

def determinePlayTimeInSeconds(results):
        threadList = []
	for result in results:
                fileReader = FileReader(result)
                fileReader.start()
                threadList.append(fileReader)
        #while activeCount() > 1:
                #sleep(1)
        for fileReader in threadList:
                (fileType, playtimeInSeconds) = fileReader.getPlaytimeInSeconds()
                print fileType, playtimeInSeconds

class FileReader(Thread):
        def __init__(self, result):
                self.fileName = result[0]
                self.fileURI = result[1]
                Thread.__init__(self)
        def run(self):
		if self.fileURI.endswith("mp3"):
                        self.fileType = "Audio"
			self.playtimeInSeconds = (len(urllib.urlopen(urllib.quote(self.fileURI, ':/')).read()) * 8) / 24000
		elif self.fileURI.endswith("wmv"):
                        self.fileType = "Video"
                        self.playtimeInSeconds = get_asf_time(urllib.urlopen(urllib.quote(self.fileURI, ':/')))
        def getPlaytimeInSeconds(self):
                return (self.fileType, self.playtimeInSeconds)
</code>

<error>
Traceback (most recent call last):
  File "<pyshell#239>", line 1, in -toplevel-
    determinePlayTimeInSeconds(resultsTuple)
  File "<pyshell#235>", line 10, in determinePlayTimeInSeconds
    (fileType, playtimeInSeconds) = fileReader.getPlaytimeInSeconds()
  File "<pyshell#233>", line 14, in getPlaytimeInSeconds
    return (self.fileType, self.playtimeInSeconds)
AttributeError: 'FileReader' object has no attribute 'fileType'
</error>




More information about the Tutor mailing list