ValueError: The future belongs to a different loop than the one specified as the loop argument

Происходит гонка двух или более потоков. Ошибка:

raise ValueError('The future belongs to a different loop than '
ValueError: The future belongs to a different loop than the one specified as the loop argument

Есть функция, которая ловит события, и их два, тех, которые по while:

from web3 import Web3
from application import db
import json
import asyncio
from application.models.BscBridge import BscBrigde
import logging
from application.services.etherium_send_service import EtheriumBridgeService


class BinanceBridgeListener:
    BSC_URL = "wss://bsc.getblock.io/testnet/?api_key=27278800-db49-4ed1-bf58-b64a6d244f2d"
    BSC_ADDRESS = '123'
    HEX = '123'

    def __init__(self):
        # bsc contract
        self.bsc_web3 = Web3(Web3.WebsocketProvider(self.BSC_URL))
        print("Connection BSC", self.bsc_web3.isConnected())
        self.abibsc = json.loads(
            '[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"type_sign","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"validator_sign","type":"bytes32"}],"name":"ConvertTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"VALIDATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_convertProcess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[],"name":"_token","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"validator","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUnlockedTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"string","name":"validator","type":"string"}],"name":"unlockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"changeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"changeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]')
        self.bsc_address = self.bsc_web3.toChecksumAddress(self.BSC_ADDRESS)
        self.bsc_contract = self.bsc_web3.eth.contract(address=self.bsc_address, abi=self.abibsc)
        self.bsc_contract_event_catcher()

    def bsc_contract_event_catcher(self):
        event_bsc_filter = self.bsc_contract.events.ConvertTransfer.createFilter(fromBlock='latest')
        loop1 = asyncio.get_event_loop()
        loop1.run_until_complete(asyncio.gather(self.log_loop(event_bsc_filter)))
        print("EVENT", event_bsc_filter)

    def log_loop(self, event_filter):
        while True:
            for transaction in event_filter.get_new_entries():
                tx_hash = transaction['transactionHash']
                tx_from = transaction['args']['from']
                tx_sign = transaction['args']["type_sign"]
                tx_amount = transaction['args']["amount"]
                tx_validator_sign = transaction['args']["validator_sign"]
                tx_bsc_addr = transaction["address"]

                print("transaction hash OF BSC BRIGDE", self.bsc_web3.toHex(tx_hash))
                print("type_sign111", self.bsc_web3.toHex(tx_sign))

                print("to address", tx_bsc_addr)
                print("from address", tx_from)
                print("from sign", self.bsc_web3.toHex(tx_sign))
                print("Amount " + str(tx_amount))
                print("Validator_sign " + self.bsc_web3.toHex(tx_validator_sign))
                bsc_model = BscBrigde()
                bsc_model.balance = tx_amount
                bsc_model.transaction_hash = tx_hash
                bsc_model.address = tx_from
                db.session.add(bsc_model)
                db.session.commit()
                send_transaction = EtheriumBridgeService()
                transaction_hash = BscBrigde.query.filter_by(transaction_hash=self.bsc_web3.toHex(tx_hash))
                if self.bsc_web3.toHex(tx_sign) == self.HEX and tx_hash != transaction_hash:
                    send_transaction.eth_brigde(bsc_model.id, bsc_model.address, bsc_model.balance)
                else:
                    print("Type sign not equal to LOCK method")



    if __name__ == '__main__':
    try:
        logger.info(f'start first thread')
        t1 = threading.Thread(target=runApp).start()
        logger.info(f'start second thread')
        t2 = threading.Thread(target=BinanceBridgeListener).start()
        t3 = threading.Thread(target=EtheriumBridgeListener).start()

    except Exception as e:
        logger.error("Unexpected error:" + str(e))


Ответы (0 шт):