2014-04-19 4 views
-1

У меня есть list и n темы. Я хотел бы использовать некоторый механизм IPC для добавления в этот список в определенном порядке, порядок в том, что первый поток записывается сначала в list, а затем второй поток и т. Д. Единственное, что я придумал, это использовать n блокировок и разблокировать блокировка другого потока после предыдущего завершения своей задачи, но я не считаю, что это правильное решение. Спасибо за вашу помощь.Выполнение потоков python в заказе

+0

В каком смысле вы считаете это решение быть "неправильно"? – NPE

+0

Прошу поэкспериментировать с некоторым фрагментом кода и посмотреть, не является ли оно правильным решением. :) –

+1

Вы должны сначала попробовать ... вы должны только верить в то, что видите ... Я знаю, что сначала он не уверен в решении проблемы и все еще пытается это сделать ... Но он хорошо окупается :) – adil

ответ

0

Вы можете использовать модуль очереди, чтобы сделать это:

from Queue import * 
from threading import Thread, Lock 

# this function will process the items in the queue, in serial 
def processor(): 
    if queue.empty() == True: 
     print "the Queue is empty!" 
     sys.exit(1) 
    try: 
     job = queue.get() 
     print "I'm operating on job item: %s"%(job) 
     queue.task_done() 
    except: 
     print "Failed to operate on job" 

# set variables 
queue = Queue() 
threads = 4 

''' a list of job items. you would want this to be more advanced, 
like reading from a file or database''' 
jobs = [ "job1", "job2", "job3" ] 

# iterate over jobs and put each into the queue in sequence 
for job in jobs: 
    print "inserting job into the queue: %s" % (job) 
    queue.put(job) 

# start some threads, each one will process one job from the queue 
for i in range(threads): 
    th = Thread(target=processor) 
    th.setDaemon(True) 
    th.start() 

# wait until all jobs are processed before quitting 
queue.join() 

Более подробную информацию о модуле очереди, есть пример бога в конце страницы: https://docs.python.org/2/library/queue.html

@EDIT Вы можете использовать a Queue с FIFO (first-in, first-out) или LIFO (last-in, first-out).

ФИФО пример:

import Queue 

q = Queue.Queue() 

for i in range(5): 
    q.put(i) 

while not q.empty(): 
    print q.get() 

>>> 0 
>>> 1 
>>> 2 
>>> 3 
>>> 4 

LIFO:

import Queue 

q = Queue.LifoQueue() 

for i in range(5): 
    q.put(i) 

while not q.empty(): 
    print q.get() 

>>> 4 
>>> 3 
>>> 2 
>>> 1 
>>> 0 
Смежные вопросы