[英]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.