asyncio VS mehrere threads
Verfasst: Mittwoch 20. November 2019, 22:58
Ich steh momentan etwas auf dem Schlauch weil ich für mein Problem die maximale Performance erreichen möchte und bisher eine Lösung sowohl mit asyncio habe als auch durch den Einsatz mehrerer threads - gefühlt ist die Performance bisher gleich mies (vielleicht liegts auch am Internet hier). Ich möchte zeitgleich von mehreren Kryptohandelsplätzen die Orderbücher beziehen und dies soll nach Möglichkeit relativ performant ablaufen.
Lösung mit mehreren threads:
Hab den Code hier mal stark gekürzt die Anzahl der APIs ist deutlich länger aber es geht ja nur ums Prinzip.
Lösung mit asyncio:
Hab den Code hier ebenfalls stark gekürzt (API Liste ist deutlich länger) aber ich denke das Prinzip ist klar. Da ich gerade frisch in Python einsteige ist auch die Syntax wohl noch stark verbesserungswürdig - komme aus der Java Welt deshalb sind so Sachen wie das anlegen globaler Variablen für mich noch etwas gewöhnungsbedürftig in Python (wenn es eine elegantere Methode gibt gerne Links und Hinweise).
Lösung mit mehreren threads:
Code: Alles auswählen
import requests
import concurrent.futures
output1 = "global"
output2 = "global2"
output3 = "global3"
output4 = "global4"
output5 = "global5"
output6 = "global6"
output7 = "global7"
output8 = "global8"
def task1():
response1 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=BTC&FiatCode=EUR&CoinAmount=1')
global output1
output1 = response1
task1()
def task2():
response2 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=ETH&FiatCode=EUR&CoinAmount=1')
global output2
output2 = response2
task2()
def task3():
response3 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=XRP&FiatCode=EUR&CoinAmount=1')
global output3
output3 = response3
task3()
def task4():
response4 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=BCH&FiatCode=EUR&CoinAmount=1')
global output4
output4 = response4
task4()
def task5():
response5 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=LTC&FiatCode=EUR&CoinAmount=1')
global output5
output5 = response5
task5()
def task6():
response6 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=EOS&FiatCode=EUR&CoinAmount=1')
global output6
output6 = response6
task6()
def task7():
response7 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=XLM&FiatCode=EUR&CoinAmount=1')
global output7
output7 = response7
task7()
def task8():
response8 = requests.get('https://anycoindirect.eu/api/public/buyprices?CoinCode=ADA&FiatCode=EUR&CoinAmount=1')
global output8
output8 = response8
task8()
def main():
executor = concurrent.futures.ThreadPoolExecutor(max_workers=9)
run1 = executor.submit(task1())
run2 = executor.submit(task2())
run3 = executor.submit(task3())
run4 = executor.submit(task4())
run5 = executor.submit(task5())
run6 = executor.submit(task6())
run7 = executor.submit(task7())
run8 = executor.submit(task8())
print(output1.text)
print(output2.text)
print(output3.text)
print(output4.text)
print(output5.text)
print(output6.text)
print(output7.text)
print(output8.text)
if __name__ == '__main__':
main()
Lösung mit asyncio:
Code: Alles auswählen
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
list = [
'https://anycoindirect.eu/api/public/buyprices?CoinCode=BTC&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=ETH&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=XRP&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=BCH&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=LTC&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=EOS&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=XLM&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=ADA&FiatCode=EUR&CoinAmount=1',
'https://anycoindirect.eu/api/public/buyprices?CoinCode=XMR&FiatCode=EUR&CoinAmount=1',
'https://bittrex.com/api/v1.1/public/getorderbook?market=USD-BTC&type=sell',
'https://bittrex.com/api/v1.1/public/getorderbook?market=USD-ETH&type=sell',
'https://bittrex.com/api/v1.1/public/getorderbook?market=USD-XRP&type=sell',
'https://bittrex.com/api/v1.1/public/getorderbook?market=USD-BCH&type=sell',
'https://bittrex.com/api/v1.1/public/getorderbook?market=USD-LTC&type=sell',
'https://bittrex.com/api/v1.1/public/getorderbook?market=USD-ADA&type=sell',
'https://api.bithumb.com/public/orderbook/BTC',
'https://api.bithumb.com/public/orderbook/ETH',
'https://api.bithumb.com/public/orderbook/XRP',
'https://api.bithumb.com/public/orderbook/BCH',
'https://api.bithumb.com/public/orderbook/LTC',
'https://api.bithumb.com/public/orderbook/EOS',
'https://api.bithumb.com/public/orderbook/XLM',
'https://api.bithumb.com/public/orderbook/ADA',
'https://api.bithumb.com/public/orderbook/XMR'
]
for counter in range(len(list)):
html = await fetch(session, list[counter])
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())