multiple threads with Logging: ValueError: I/O operation on closedfile

S

scriptlearner

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 line
logging.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.start()
time.sleep(0.1)
 
V

Vinay Sajip

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.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
 
V

Vinay Sajip

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.start()
time.sleep(0.1)


Take a look at this example test script to see how to use logging in a
multi-threaded environment:

http://dpaste.com/hold/89734/

Regards,

Vinay Sajip
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top