2016-08-25 4 views
0

Я новичок в python multiprocessing. Я пытаюсь использовать third-party web-API для получения данных для нескольких интересующих символов. Вот мой питон код:Python Multiprocessing: детские процессы, работающие с разной скоростью

<!-- language:lang-py--> 

def my_worker(symbol, table_name): 
    while True: 
     # Real-time data for the symbol, third party code which is verified 
     data = webApi.getData(symbol) 
     query = ('insert into ' + table_name + '(var1, var2) values("%s, %s")' %(data[0], data[1])) 
     # Execute query and store the data. Omitted for sake of brevity 

if __name__ == "__main__": 
    my_symbols = get_symbols_list() # List of symbols 
    my_tables = get_tables_list() # Corresponding list of mysql tables 
    jobs = [] 
    for pidx in range(len(my_symbols)): 
     pname = 'datarecorder_' + my_symbols[pidx] # Naming the process for later identification 
     p = multiprocessing.Process(name=pname, target=my_worker, args=(my_symbols[pidx], my_tables[pidx],)) 
     jobs.append(p) 
     p.start() 

Есть приблизительно 50 processes created в этом коде.

Проблема, что я столкнулся:является то, что, когда я смотрю в соответствующие таблицы по истечении определенного периода времени (скажем, 5 минут), количество записей в каждой из таблицы в my_tables резко отличается (порядка 10 с)

Поскольку я использую тот же API, то же сетевое соединение и тот же код для извлечения и записи данных в таблицы mysql, я не уверен, что вызывает эту разницу в количество записей. My hunch is that each of the 50 processes is getting assigned an unequal amount of RAM and other resources, and perhaps the priority is also different(?)

Может кто-нибудь сказать мне, как я могу обеспечить, чтобы каждый из этих процессов опросил webApi примерно равное количество раз?

+0

_ порядка 10s_ Вы имеете в виду, что в некоторых таблицах имеется еще 50 записей, или что в некоторых таблицах есть 50 _times_ столько записей, сколько другие? Планирование не является детерминированным \ *, поэтому вы не можете и, следовательно, также не должны зависеть от его поведения каким-либо определенным образом. Справедливость - это цель, но нет гарантии для нее в режиме реального времени. \ * Для полезных определений детерминированных. – Cubic

+0

Я имею в виду, что через 5 минут некоторые таблицы будут иметь 10-20 записей, а другие могут иметь 200-300 записей. Если справедливость - это цель, количество записей в этих таблицах должно быть более или менее равным, и несколько записей более или менее не причинят мне вреда, но этот порядок различий слишком критичен, чтобы игнорировать. – joshi

+0

Мне кажется, вам будет лучше использовать [multiprocessing.Pool] (https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.пул) (например, apply_async или map) вместо того, чтобы создавать все Процессы напрямую, поскольку создание новых Процессов занимает некоторое время - возможно, это причина проблемы синхронизации – janbrohl

ответ

0

Эффективный способ приблизиться к таким вещам - начать с чего-то гораздо более простого, затем добавить материал, пока не появится «проблема». В противном случае это просто слепые догадки.

Например, вот что-то гораздо проще, что я бегу под виндой (как вы - я использую текущий Win10 Pro) и Python 3.5.2:

import multiprocessing as mp 
from time import sleep 

NPROCS = 50 

def worker(i, d): 
    while True: 
     d[i] += 1 
     sleep(1) 

if __name__ == "__main__": 
    d = mp.Manager().dict() 
    for i in range(NPROCS): 
     d[i] = 0 

    ps = [] 
    for i in range(NPROCS): 
     p = mp.Process(target=worker, args=(i, d)) 
     ps.append(p) 
     p.start() 

    while True: 
     sleep(3) 
     print(d.values()) 

Вот самый последний выход примерно через минуту бега:

[67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 
67, 67, 67, 67, 67, 67, 67, 67, 67, 66, 
66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 
66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 
66, 66, 66, 66, 66, 66, 66, 66, 66, 66] 

Так что можно сделать вывод о том, что нет ничего «по своей природе несправедливо» о планировании процесса на этом поле. На вашей коробке? Запустите его и посмотрите ;-)

В диспетчере задач я также вижу, что все 50 процессов обрабатываются одинаково, с (например) одним и тем же объемом использования ОЗУ и приоритетом. FYI, эта коробка имеет 8 логических ядер (4 физических) и более чем достаточно ОЗУ (16 ГБ).

В настоящее время существуют миры дополнительных осложнений в том, что вы делаете, о которых мы не можем догадаться. Например, возможно, у вас закончилось ОЗУ, поэтому некоторые процессы сильно задерживаются подкачкой подкачки. Или, может быть, работа, которую вы делаете, занимает гораздо больше времени, чем другие. Или ... но, несмотря на это, самый простой способ узнать - это постепенно сделать очень простую программу немного заурядной за раз.

 Смежные вопросы

  • Нет связанных вопросов^_^