我是python multiprocessing
的新手。我正在嘗試使用third-party web-API
爲多個感興趣的符號獲取數據。這裏是我的Python代碼:Python多處理:子進程以不同的速度工作
<!-- 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大致相同的次數?
_on的倍數爲10s_ 您的意思是說某些表格中有50個以上的記錄,或者某些表格的記錄數量是其他記錄的50倍?調度不是確定性的\ *,所以你不能,因此也不應該依賴它以任何特定的方式行事。公平是目標,但不能保證實時調度。 \ *有關確定性的有用定義。 – Cubic
我的意思是5分鐘後某些表格將有10-20條記錄,而其他表格可能有200-300條記錄。如果公平是目標,這些表格中的記錄數應該大致相等,並且多少或多或少的記錄不會對我造成傷害,但是這種差異的順序太不容忽視。 – joshi
對我來說,使用[multiprocessing.Pool](https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing。(例如apply_async或map),而不是直接創建所有進程,因爲創建新進程需要一些時間 - 也許這就是時間問題的原因 – janbrohl