Я разрабатываю торгового бота python, и для анализа нескольких монет я использую библиотеку потоков, проблема в том, что когда я создаю N объектов в N потоках, объекты используют один и тот же объект, как я думаю, потому что они используют один и тот же кучи памяти ..
Введение в код
class BotEngine:
cryptos = []
crypto_process=[]
status="Offline"
def CurrentStatus(self):
return self.status
def Work(self):
if self.status != "Online":
self.status="Online"
myCoins = getCash()
print("Coins: "+str(myCoins.count()))
if myCoins != None:
for coin in myCoins:
print("coin: "+str(coin))
#start thread
newThread = None
newThread = CryptoThread(coin["Coin"],coin["Percentage"])
newThread.start()
self.crypto_process.append(newThread)
print("Starting : "+"thread_"+coin["Coin"])
else:
print("No coins")
else:
print("Bot is already working!")
Этот класс имеет роль для запуска нескольких разных потоков.
Следующий класс - это фактический поток,
class CryptoThread(Thread):
coin=""
percentage=""
id=""
status="Offline"
coin_strategy=None
status_log=[]
def __init__(self,coin,percentage):
Thread.__init__(self)
self.coin = coin
self.percentage = percentage
self.id = "thread_"+coin
logger.info("init thread")
def run(self):
self.StartTh()
def StartTh(self):
t = threading.currentThread()
t.status_log = []
#check if exists an order on the db
old_order = db_manager.getOrder(self.coin)
if old_order == None:
#then if not
logger.info(self.id)
if self.coin_strategy == None:
logger.info("No strategy setted , will be used the base one!")
self.coin_strategy = Strategy("BaseStrategy", self.coin,self.percentage) #if no strategy is set i set the baseone
self.status = "Online"
else:
logger.info("Older Order found for "+self.id)
self.status_log.append(self.id+" |: Older Order found")
self.coin_strategy = Strategy("Strategy",self.coin,self.percentage,int(old_order["CoinAmount"]),True,old_order["TakeProfit"],old_order["StopLoss"],old_order["Risk"],old_order["CoinPrice"])
self.status = "Online"
while self.status == "Online":
#get the data and prepare it to sent to the strategy
#then the strategy check for stop loss or takeprofit
df = data_manager.getDataframe(self.coin)
self.coin_strategy.analyse(df)
self.status_log.extend(self.coin_strategy.status_log)
t.status_log=self.status_log
logger.info("Thread for : "+self.id + " is working, wait 20s for the next scan")
sleep(20 - time() % 20)
Этот класс расширяет поток и должен работать в другом потоке, класс устанавливает новую торговую стратегию: self.coin_strategy = Strategy (...), проблема в self.coin_Strategy передается между потоками Как я могу это исправить??
Я не хочу использовать многопроцессорность, потому что у меня возникают новые проблемы с клиентом api.
Кто-нибудь знает, как я могу решить проблему?