2016-06-22 5 views
0

Имеет дело, у меня есть определенные записи в моей базе данных. Я звоню Джанго:For loop python information

variables = Variable.objects.order_by('foo').values('foo') 

Тогда у меня есть для заявления, который выполняется на каждой переменной найденной

for x in variables: 
    #doing something.... 

Моя проблема заключается в том, что «делать что-то» является постоянной задачей ... т.е. он не останавливается. Итак, как мне удастся запустить цикл for во второй переменной?

Я считаю, что это связано с объединением, но разве это не значит, что у меня может быть только 4 процесса одновременно? Как бы мне это сделать, если бы я хотел сказать 50 отдельных процессов для запуска для каждой 50 переменных, и каждый процесс не останавливается до определенного времени или никогда ...

Можно ли это сделать.

Вот мой многопроцессорная код:

if __name__ == '__main__': 
x = Variable.objects.order_by('foo').values('foo') 
for t in x: 
    t = t.values() 
    foo = "".join(t) 
    info('Starting...') 
    p = Process(target=myfunction, args=(foo,)) 
    p.start() 
    p.join() 

MyFunction является то, что работает на бесконечном цикле ...

@samuel:

# globals 
my_queue = multiprocessing.Manager().Queue() # queue to store our values 
stop_event = multiprocessing.Event() # flag which signals processes to stop 
my_pool = None 

def my_function(foo): 
    while not stop_event.is_set(): 
     print("starting %s" % foo) 
     try: 
      var = my_queue.get_nowait() # getting value from queue 
     except Queue.Empty: 
      print "No more items in queue" 
     # do you logic here 


# Since `t` could have unlimited size but do wan't to limit processes 
# we'll put all `t` value in queue 

x = Company.objects.order_by('ticker').values('ticker') 
for t in x: 
    foo = t.values() 
    my_queue.put(foo) 

MAX_PROCESSES = len(x) 
my_pool = multiprocessing.Pool(MAX_PROCESSES) 

for i in range(MAX_PROCESSES): 
    my_pool.apply_async(my_function, args=(foo,)) 
my_pool.close() 
my_pool.join() 
+1

[ 'multithreading'] (https://docs.python.org/2/library/threading.html) –

+0

Я полагал, что это был один из их. Спасибо за быстрый ответ –

+0

@MoonCheesez - 'threading' обычно является плохим выбором для 50 одновременных задач, потому что python GIL позволяет только запустить время. «многопроцессорство» было бы лучшим выбором. Так что же такое «многопоточность»? – tdelaney

ответ

0

Это путь решение может быть реализовано используя многопроцессорную библиотеку.

Мы будем использовать Pool, apply_async и Queue

# globals 
MAX_PROCESSES = 50 
my_queue = multiprocessing.Manager().Queue() # queue to store our values 
stop_event = multiprocessing.Event() # flag which signals processes to stop 
my_pool = None 

def my_function(proc_name, var): 
    while not stop_event.is_set(): 
     # do you logic here with var variable 


def var_scanner_process(): 
    # Since `t` could have unlimited size we'll put all `t` value in queue 
    while not stop_event.is_set(): # forever scan `values` for new items 
     x = Variable.objects.order_by('foo').values('foo') 
     for t in x: 
      t = t.values() 
      my_queue.put(t) 
     time.sleep(10) 

try: 
    var_scanner_process = Process(target=var_scanner) 
    var_scanner_process.start() 
    my_pool = multiprocessing.Pool(MAX_PROCESSES) 

    while not stop_event.is_set(): 
     try: # if queue isn't empty, get value from queue and create new process 
      var = my_queue.get_nowait() # getting value from queue 
      p = Process(target=my_function, args=("process-%d" % i, var)) 
      p.start() 
     exception Queue.Empty: 
      print "No more items in queue" 

except KeyboardInterrupt as stop_test_exception: 
    print(" CTRL+C pressed. Stopping test....") 
    stop_event.set() 
+0

Я очень ценю помощь. Могу ли я получить разъяснения? Сначала переменные находятся, а затем помещаются в «очередь», а затем соединяются? Затем для i в диапазоне («50») применяется асинхронный режим для функции и передается «идентификатор процесса»? что такое идентификатор процесса? и как мне получить «t» в «my_function» –

+0

exception Queue.Empty: это недопустимый синтаксис. ты можешь помочь мне с этим? –

+0

@DenisAngell вам нужно импортировать 'Queue' module для обработки' Queue.Empty' exception – Samuel