File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs

dzizes451 dzizes451 at gmail.com
Thu Jan 13 05:28:12 EST 2011


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



More information about the Python-list mailing list