这是代码,这些是虚拟类,最终会被更有用的东西取代。我想要while循环做的是从队列中提取数据以查看毒丸是否被丢弃。如果不是,我想要触发else语句中的任何内容。但是由于某些原因,它会等到它获得一个毒丸并且只在声明
时才执行kill条件class test_imports:#Test classes remove
def import_1(self, control_queue, thread_number):
print ("Import_1 number %d started") % thread_number
run = True
count = 1
while run == True:
alive = control_queue.get()
count = count + 1
if alive == 't1kill':#<==will trigger
print ("Killing thread type 1 number %d") % thread_number
run = False
else:#<== won't trigger
print ("Thread type 1 number %d run count %d") % (thread_number, count)
如果需要,剩下的代码是:
import multiprocessing
import time
class test_imports:#Test classes remove
def import_1(self, control_queue, thread_number):
print ("Import_1 number %d started") % thread_number
run = True
count = 1
while run == True:
alive = control_queue.get()
count = count + 1
if alive == 't1kill':
print ("Killing thread type 1 number %d") % thread_number
run = False
else:
print ("Thread type 1 number %d run count %d") % (thread_number, count)
def import_2(self, control_queue, thread_number):
print ("Import_2 number %d started") % thread_number
run = True
count = 1
while run == True:
alive = control_queue.get()
count = count + 1
if alive == 't2kill':
print ("Killing thread type 2 number %d") % thread_number
run = False
else:
print ("Thread type 2 number %d run count %d") % (thread_number, count)
class worker_manager:
def __init__(self):
self.children = {}
def generate(self, control_queue, threadName, runNum):
i = test_imports()
if threadName == 'one':
print ("Starting import_1 number %d") % runNum
p = multiprocessing.Process(target=i.import_1, args=(control_queue, runNum))
self.children[threadName] = p
p.start()
elif threadName == 'two':
print ("Starting import_2 number %d") % runNum
p = multiprocessing.Process(target=i.import_2, args=(control_queue, runNum))
self.children[threadName] = p
p.start()
elif threadName == 'three':
p = multiprocessing.Process(target=i.import_1, args=(control_queue, runNum))
print ("Starting import_1 number %d") % runNum
p2 = multiprocessing.Process(target=i.import_2, args=(control_queue, runNum))
print ("Starting import_2 number %d") % runNum
self.children[threadName] = p
self.children[threadName] = p2
p.start()
p2.start()
else:
print ("Not a valid choice choose one two or three")
def terminate(self, threadName):
self.children[threadName].join
if __name__ == '__main__':
# Establish communication queues
control = multiprocessing.Queue()
manager = worker_manager()
runNum = int(raw_input("Enter a number: "))
threadNum = int(raw_input("Enter number of threads: "))
threadName = raw_input("Enter number: ")
thread_Count = 0
print ("Starting threads")
for i in range(threadNum):
manager.generate(control, threadName, i)
thread_Count = thread_Count + 1
time.sleep(runNum)#let threads do their thing
print ("Terminating threads")
for i in range(thread_Count):
control.put("t1kill")
control.put("t2kill")
manager.terminate(threadName)
请注意import_2
与import_1
相同,但打印的内容不同。关键是要证明处理不同线程类型的能力。
答案 0 :(得分:0)
在您的驱动程序代码中,您首先control.put("t1kill")
。
您t1kill
的处理程序设置run = False
,因此您不会再次通过while run == True
循环返回。
因此,您的else
无法被触发。
如果你想测试它,只需添加put
个虚拟值:
for i in range(thread_Count):
control.put("dummy")
control.put("t1kill")
control.put("t2kill")
但是,在真正的代码中,您可能希望manager.generate
方法在队列中放置一些有用的值。
作为旁注,你使代码变得比它需要的更复杂。
首先,写while run == True:
而不仅仅是while run:
几乎总是一个坏主意。正如PEP 8的Programming Recommendations部分所说:
不要使用==。
将布尔值与True或False进行比较
但实际上,只要你完成就可以return
,并完全取消run
标志:
while True:
alive = control_queue.get()
count = count + 1
if alive == 't1kill':
print ("Killing thread type 1 number %d") % thread_number
return
else:
print ("Thread type 1 number %d run count %d") % (thread_number, count)
(有些人会告诉你break
,早期return
等是“糟糕的结构化编程”。但Python不是C。)