Форум сайта python.su
Здравствуйте , столкнулся с такой проблемой .
вот примерный код
class RunRule(Process): def __init__ (self,...,sem): Process.__init__(self) ... self.poolsem=sem def runproc(self,command): try: err='' p=Popen(command,stderr=PIPE,close_fds=True) err=p.stderr.read() p.stderr.close() except ValueError: pass except: self.log.exception("There was a problem.") finally: if p.poll() == None: try: kill(p.pid,SIGKILL) except OSError: pass waitpid(-1, WNOHANG) self.poolsem.release() def processing(self): self.log.info("Start processing") threads=[] while len(self.queue) > 0 and not self.shutdown: while not self.poolsem.acquire(timeout=0.01): for t in threads: t.isAlive() else: command='command' tr=StoppableThread(target=self.runproc,args=(command)) tr.start() threads.append(tr) time.sleep(0.05) self.log.info("Wait while all threads to complete") endtime=int(time.time())+300 sys.setcheckinterval(10) while True: if int(time.time()) > endtime: break if not any([t.isAlive() for t in threads]): break else: time.sleep(1) self.log.info("Stop threads") for t in threads: if t.isAlive(): t.stop() t.join(15) del threads self.log.info("End processing") class ProcQueue(Process): def __init__(self,rule_active_state): Process.__init__(self,name='ProcQueue') self.procrules=[] self.shutdown=False self.sem=BoundedSemaphore(value=config.PROCESSCOUT) def run(self): try: cfg=read_conf() rules_count=len(cfg) if rules_count>0: for line in cfg: bg = RunRule(line[0],int(line[1]),str(line[2]),str(line[3]),str(line[4]),line[5],str(line[6]),str(line[7]),str(line[8]),self.sem) bg.daemon=True bg.start() pid=int(bg.pid) self.log.info("rule pid = %d",pid) self.procrules.append(bg) time.sleep(2) while not self.shutdown: gc.collect() time.sleep(60) except BaseException: self.log.exception("There was a problem.")
Офлайн
похоже проблема не в коде а в планировщике I/O ядра линукс …
У меня был установлен планировщик deadline. Сейчас я заменил на Completely Fair Queuing (CFQ)
выполнив “echo cfq > /sys/block/sda/queue/scheduler”
После этого проблема пока не замечалась
Офлайн
Эту задачу разве не проще решить через очередь и пул потоков? Как-то постоянно засыпать, просыпаться, джойниться, проверять жив ли тред… выглядит сложно :)
Офлайн