2017-08-11 4 views
0

J'essaye de prototyper un simple script python pour apprendre à utiliser le multitraitement. Je veux avoir un processus en arrière-plan qui va générer des données factices et le mettre dans une file d'attente pendant que l'utilisateur est encore capable de taper des commandes.Le processus ne démarre pas en python

Voici mon code:

from multiprocessing import Process 
from multiprocessing import Queue 
import random 
import os 

global run 

def waitForStart(q): 
    global run 
    print("(h for help)") 
    while run == 0: 
     response = input("Enter a command: \n") 

     if response == "h": 
      print("h - help\ns - select a profile\no - output a profile\nd - 
download a profile\nd - display selected profile\nr - run selected profile") 

     if response == "r": 
      run = 1 
      beginInterface(q) 
      print("r") 

def generateData(q): 
    data = random.randint(0,100) 
    q.put(data) 

def beginControl(q): 
    print("bcontrol") 
    while run == 1: 
     generateData(q) 
     displayData() 
     adjustOutputs() 
     logData() 
    print("Finished Control") 

def beginInterface(q): 
    global run 
    p.start() 
    print("binterface") 
    while run == 1: 
     response = input("pause? (y/n)\n") 
     print(p.is_alive()) 
     if response == 'y': 
      run = 0 

def displayData(): 
    print(q.get()) 

run = 0 
q = Queue() 
p = Process(target=beginControl , args=(q,)) 
waitForStart(q) 

Je suis confus parce que le retour appel is_alive faux, même si p.start() est appelée quelques lignes avant.

Répondre

0

Étant donné que vous avez deux processus, le run dans la deuxième est 0 et n'entre jamais dans la boucle. Pour communiquer entre votre processus principal et le second, utilisez un Pipe or a Queue.

Important, si sur Win ne faut pas oublier d'ajouter:

if __name__ == "__main__": 

See reason here.

Une autre chose, vous ne passer la file d'attente pour displayData, modifier à:

def displayData(q): 
    print(q.get()) 

également , Je pense que ce que vous voulez vraiment est un thread car ce code mettra le processus dans une boucle infinie.

Ce n'est pas exactement votre code, mais il donne l'idée:

from multiprocessing import Process 
from multiprocessing import Queue, Pipe 
import random 
import time 


def waitForStart(q): 
    global run 
    print("(h for help)") 
    while True: 
     response = input("Enter a command: \n") 

     if response == "h": 
      print("h - help" 
        "s - select a profile" 
        "o - output a profile" 
        "d - download a profile" 
        "d - display selected profile" 
        "r - run selected profile") 

     if response == "r": 
      run = 1 
      beginInterface() 
      print("r") 


def generateData(q): 
    data = random.randint(0,100) 
    q.put(data) 


def beginControl(q): 
    print("bcontrol") 
    while q.empty(): 
     generateData(q) 
     displayData(q) 
     #adjustOutputs() 
     #logData() 
    print("Finished Control") 


def beginInterface(): 
    p.start() 
    print("binterface") 
    while True: 
     print(p.is_alive()) 
     time.sleep(1) 
     q.put('DIE!') 
     p.join() 
     exit() 


def displayData(q): 
    data = q.get() 
    if data != 'DIE!': 
     print(data) 


if __name__ == "__main__": 
    q = Queue() 
    pip = Pipe() 
    p = Process(target=beginControl, args=(q,)) 
    waitForStart(q) 
+0

Merci! Je suis toujours un peu flou sur les tuyaux, donc je vais lire dans ce sujet. J'essaie de faire fonctionner le processus dans une boucle contrôlée par l'entrée de l'utilisateur. Ce que je voudrais faire, c'est que le processus génère et imprime continuellement des données à l'écran pendant que l'utilisateur peut encore saisir des commandes. Finalement, je veux l'adapter à un code connecté à LabView, où le processus d'arrière-plan enregistrera des données provenant de capteurs, et j'ai besoin que l'utilisateur soit toujours capable de contrôler le programme via un frontal. – egemnay

+0

@egemnay, Comme indiqué, ce dont vous avez besoin est un fil de discussion, pas un processus - https://docs.python.org/2/library/threading.html?highlight=threading#module-threading – droravr