簡體   English   中英

進程無法在python中啟動

[英]Process won't start in python

我正在嘗試制作一個簡單的python腳本原型,以學習如何使用多重處理。 我想在后台創建一個進程,該進程將生成偽數據並將其放入隊列,而用戶仍然可以鍵入命令。

這是我的代碼:

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)

我很困惑,因為即使p.start()之前被調用了幾行,is_alive調用仍返回false。

由於您有兩個進程,因此第二個run的次數為0 ,因此永遠不會進入循環。 要在您的主要流程和第二個流程之間進行通信,請使用Pipe或Queue

重要說明,如果在Win上不要忘記添加:

if __name__ == "__main__":

在這里查看原因。

另一件事,您永遠不會將Queue傳遞給displayData ,編輯為:

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

另外, 我認為您真正想要的是一個Thread,因為此代碼會將Process陷入無限循環。

這不完全是您的代碼,但傳達了這個想法:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM