2010-05-11 10 views
0

Je cours une fonction qui évalue les commandes passées en utilisant stdin et une autre fonction qui exécute un tas de travaux. J'ai besoin de faire dormir cette dernière fonction à intervalles réguliers mais cela semble bloquer le stdin. Tout conseil sur la façon de résoudre ce problème serait apprécié.Dormir un thread bloque stdin

Le code source pour les fonctions est

def runJobs(comps, jobQueue, numRunning, limit, lock): 
    while len(jobQueue) >= 0: 
     print(len(jobQueue)); 
     if len(jobQueue) > 0: 
      comp, tasks = find_computer(comps, 0); 
      #do something 
     time.sleep(5); 

def manageStdin(): 
    print "Global Stdin Begins Now" 
    for line in fileinput.input(): 
     try: 
      print(eval(line)); 
     except Exception, e: 
      print e; 

--Thanks

Répondre

1

Utilisez un seul fil:

import time 
import select 
import logging 
import sys 

def stdinWait(interval): 
    start = time.time() 
    while True: 
     time_left = interval - (time.time() - start) 
     if time_left <= 0: 
      break 
     r, w, x = select.select([sys.stdin], [], [], time_left) 
     if r: 
      line = r[0].readline() 
      try: 
       print(eval(line)); 
      except Exception, e: 
       logging.exception(e) 

def runJobs(comps, jobQueue, numRunning, limit, lock): 
    while len(jobQueue) >= 0: 
     print(len(jobQueue)); 
     if len(jobQueue) > 0: 
      comp, tasks = find_computer(comps, 0); 
      #do something 
      stdinWait(5) # wait 5 seconds while watching stdin 
+0

Que se passerait-il si l'entrée stdin a pris plus de 5 secondes type? – Opt

+0

@Sid: l'appel 'select' expirerait et cela fonctionnerait très bien. – nosklo

+0

@nosklo: Mais alors comment pourrais-je être capable d'entrer quelque chose dans le stdin si cela prenait plus de 5 secondes à taper car cela expirerait avant que j'aie eu la chance de finir de taper l'entrée. – Opt