Я новичок в 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 примерно равное количество раз?
_ порядка 10s_ Вы имеете в виду, что в некоторых таблицах имеется еще 50 записей, или что в некоторых таблицах есть 50 _times_ столько записей, сколько другие? Планирование не является детерминированным \ *, поэтому вы не можете и, следовательно, также не должны зависеть от его поведения каким-либо определенным образом. Справедливость - это цель, но нет гарантии для нее в режиме реального времени. \ * Для полезных определений детерминированных. – Cubic
Я имею в виду, что через 5 минут некоторые таблицы будут иметь 10-20 записей, а другие могут иметь 200-300 записей. Если справедливость - это цель, количество записей в этих таблицах должно быть более или менее равным, и несколько записей более или менее не причинят мне вреда, но этот порядок различий слишком критичен, чтобы игнорировать. – joshi
Мне кажется, вам будет лучше использовать [multiprocessing.Pool] (https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.пул) (например, apply_async или map) вместо того, чтобы создавать все Процессы напрямую, поскольку создание новых Процессов занимает некоторое время - возможно, это причина проблемы синхронизации – janbrohl