FAQ
Hello!

I wrote a python (2.6) deamon running on linux. Program (deamon,
manager) collects lets say work-orders from db and creates sub-
processes for each one. Sub-processes do their job with out problems,
errors, exceptions. However, sometimes deamon throws:

Traceback (most recent call last):
File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/usr/lib/python2.6/multiprocessing/util.py", line 281, in
_exit_function
p.join()
File "/usr/lib/python2.6/multiprocessing/process.py", line 119, in
join
res = self._popen.wait(timeout)
File "/usr/lib/python2.6/multiprocessing/forking.py", line 117, in
wait
return self.poll(0)
File "/usr/lib/python2.6/multiprocessing/forking.py", line 106, in
poll
pid, sts = os.waitpid(self.pid, flag)
OSError: [Errno 4] Interrupted system call


the main deamon process crushes (after some time) and the sub-
processes (childs) work fine until their work is finished.

below sample code that is responsible for creating sub_processes :

#!/usr/bin/python2.6

import pwd
import os
import sys
import time

import multiprocessing
import signal

import traceback

from deamon import deamon
from post import post

class manager(deamon):

def __run_subprocess(self, typ, work_order):
def runrun(t, z):
self.__info('creating object post for %s' %(z))
wns = post(z)
self.__info('done creating object post for %s' %(z))

#slownik z choiceem opcji
choice = {'typ1': wns.typ1,
'typ2': wns.typ2,
'typ3': wns.typ3}

if typ in choice:
self.__info('lounching %s for %s' %(t, z))
choice[typ]()
else:
self.__blad('nie znam %s typu operacji post, znam
tylko %s' \
%(t, str(choice)))
wns.endit()
del(wns)
self.__blad('problem with starting proces for =%s, typ=
%s' %(z, t))
try:
p = multiprocessing.Process(target=runrun,
args=(typ,work_order))
self.__info('done preparing proces...')
p.start()
self.__info('done lounching process...doing join...')
p.join()

return p.pid

except Exception, err:
ex = sys.exc_info()
sys.stderr.write(str(sys.exc_info()))
msg = 'manager.__run_subprocess %s error in line %s'
sys.stderr.write(msg %(str(err), ex[2].tb_lineno))
#traceback.print_last()
return None


def __liczba_wierszy(self, active_child):
return int(self._deamon__liczba_proces - active_child)

def run(self):
try:
while True:
active_child = len(multiprocessing.active_children())

#czy liczba pod-procesow <= liczba mozliwych pod-
procesow
if active_child <= self._deamon__liczba_proces:

lista_zlecen = self._deamon__baza.get_work(

self.__liczba_wierszy(active_child))

if len(lista_zlecen) > 0:
for work_order in lista_zlecen:
self.__info('start %s' %(work_order))
pid =
self.__run_subprocess('typ1',work_order)
self.__info('end %s %s' %(work_order,
str(pid)))

time.sleep(self._deamon__sleep)

elif active_child == self.__liczba_proces:
msg = 'number of processes %i is equal to maximum
%i, '\
'going sleep for %i seconds' %(
active_child,
self.__liczba_proces, self._deamon__sleep)

self.__info(msg)
time.sleep(self._deamon__sleep)

else:
self.__info('nothing to do... going sleep for %i
seconds'
%(self._deamon__liczba_proces))
#self._deamon__baza.zamknij_polacznie()
time.sleep(self._deamon__sleep)

except Exception, err:
ei = sys.exc_info()
msg = 'manager.run %s\n' %(str(err))
sys.stderr.write('error in line %s\n' %
(str(ei[2].tb_lineno)))
sys.stderr.write(msg)

def receive_sygnal(self, signum, stack):
if signum == 10:
#print 'otrzymalem sygnal', signum
self.__zapisz_status()

elif signum == 12:
self.__info('cheking if there are any active sub-
processes')
while len(multiprocessing.active_children()) > 0:
self.__info('liczba podprocesow > 0, ide spac na 10
sekund')
time.sleep(10)
else:
print 'got unknown signal', signum

Search Discussions

  • Terry Reedy at Jan 13, 2011 at 4:46 pm

    On 1/13/2011 5:28 AM, dzizes451 wrote:
    Hello!

    I wrote a python (2.6) deamon running on linux. Program (deamon,
    manager) collects lets say work-orders from db and creates sub-
    processes for each one. Sub-processes do their job with out problems,
    errors, exceptions. However, sometimes deamon throws:

    Traceback (most recent call last):
    File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
    I would either just try 2.7 or at least examine What's New or even
    Misc/NEWS in the repository to see if there were changes that affect
    this. My impression is that there were.

    --
    Terry Jan Reedy

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedJan 13, '11 at 10:28a
activeJan 13, '11 at 4:46p
posts2
users2
websitepython.org

2 users in discussion

Terry Reedy: 1 post Dzizes451: 1 post

People

Translate

site design / logo © 2022 Grokbase