multiple threads with Logging: ValueError: I/O operation on closed file

Vinay Sajip vinay_sajip at yahoo.co.uk
Mon Nov 10 09:01:55 CET 2008


On Nov 8, 10:52 pm, scriptlear... at gmail.com wrote:
> OS: Solaris 9
> Python Version: 2.4.4
>
> I need to log certain data in a worker thread; however, I am getting
> an error now when I use two worker threads.
> I think the problem comes from the linelogging.info('Thread Object (%d):(%d), Time:%s in seconds %d'%
> (self.no,self.duration,time.ctime(),time.time()))
> when multiple worker thread is trying to update the log files.
> What did I do wrong?  Should I lock the log file before writing to
> it?  Thanks.
>
> Traceback (most recent call last):
>   File "/tools/python-2_4_4.i386.solaris.5_9/lib/python2.4/logging/
> __init__.py", line 737, in emit
>     self.stream.write(fs % msg)
> ValueError: I/O operation on closed file
> Traceback (most recent call last):
>   File "/tools/python-2_4_4.i386.solaris.5_9/lib/python2.4/logging/
> __init__.py", line 737, in emit
>     self.stream.write(fs % msg)
> ValueError: I/O operation on closed file
>
> class Worker(threading.Thread):
>     def __init__(self,no,duration):
>         threading.Thread.__init__(self)
>         self.no = no
>         self.duration = duration
>
>     def run(self):
>         end = time.time() + self.duration
>
>         while(end > time.time()):
>            logging.info('Thread Object (%d):(%d), Time:%s in seconds
> %d'%(self.no,self.duration,time.ctime(),time.time()))
>             time.sleep(10)
>
> def main():
>     children = []
>    logging.basicConfig(level=logging.INFO,
>                         format='%(asctime)s %(levelname)s %
> (message)s',
>                         filename='logs/myapp.log',
>                         filemode='w')
>     args = parseArgs()
>
>     for i in range(args.threads):
>        logging.info('i=%d'%(i))
>         children.append(Worker(i,args.duration))
>         children[i].start()
>         time.sleep(0.1)

It would be helpful if you could post a complete script which shows
the problem. You should be doing a join for each of the threads
spawned in the main thread, as otherwise the main thread will exit
after the for loop and cause atexit processing to be done (which
causes logging handlers to be closed).

Regards,

Vinay Sajip



More information about the Python-list mailing list