Python Многопоточные разные объекты имеют один и тот же общий объект - PullRequest
0 голосов
/ 01 августа 2020

Я разрабатываю торгового бота 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.
Кто-нибудь знает, как я могу решить проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...