2017-02-02 52 views
0

我不知道为什么下面的代码工作。我停留在部分多线程增量了解订购

for t in worker_threads: 
    t.join() 

对我来说,这一切都为等待每个worker线程.put(1)counter_queue

我不太确定这些行的目的是否为del t立即销毁它们。我可能会丢失这些重复行的意义:

t = threading.Thread(target=print_manager) 
t.daemon = True 
t.start() 
del t 

有什么我缺少关于.daemon标志?还是还有别的东西?

import threading, queue 

########################################################################################### 

counter = 0 

counter_queue = queue.Queue() 

def counter_manager(): 
    'I have EXCLUSIVE rights to update the counter variable' 
    global counter 

    while True: 
     increment = counter_queue.get() 
     counter += increment 
     print_queue.put([ 
      'The count is %d' % counter, 
      '---------------']) 
     counter_queue.task_done() 

t = threading.Thread(target=counter_manager) 
t.daemon = True 
t.start() 
del t 

########################################################################################### 

print_queue = queue.Queue() 

def print_manager(): 
    'I have EXCLUSIVE rights to call the "print" keyword' 
    while True: 
     job = print_queue.get() 
     for line in job: 
      print(line) 
     print_queue.task_done() 

t = threading.Thread(target=print_manager) 
t.daemon = True 
t.start() 
del t 

########################################################################################### 

def worker(): 
    'My job is to increment the counter and print the current count' 
    counter_queue.put(1) 

print_queue.put(['Starting up']) 
worker_threads = [] 
for i in range(10): 
    t = threading.Thread(target=worker) 
    worker_threads.append(t) 
    t.start() 
for t in worker_threads: 
    t.join() 

counter_queue.join() 
print_queue.put(['Finishing up']) 
print_queue.join() 

输出:

Starting up 
The count is 1 
--------------- 
The count is 2 
--------------- 
The count is 3 
--------------- 
The count is 4 
--------------- 
The count is 5 
--------------- 
The count is 6 
--------------- 
The count is 7 
--------------- 
The count is 8 
--------------- 
The count is 9 
--------------- 
The count is 10 
--------------- 
Finishing up 

回答

0

因此,原来我有的del功能的误解。 del实际上取消了对象/线程的引用。它仍然存在于后台并仍在运行并正在监听输入!