消费

290 阅读1分钟
import time
from kafka import KafkaConsumer
from concurrent.futures import ProcessPoolExecutor
from concurrent.futures.process import BrokenProcessPool
from logger import Logger
from chain_data.helper import DeFiContract
from chain_data.driver import DbMytokenConn
import json
import web3
import grequests
from config import cfg
logging = Logger.default_logger('chain_currency_data')
dbmt = DbMytokenConn()


def g_handler(*args):
    logging.error("post error")

# 并发同步 post 到
def async_post_to_remote(post_data):
    """
    并发post
    :param post_data:
    :return:
    """
    post_list = [grequests.post(cfg.get('api', 'holder_percent_create'), data={'json': json.dumps(item)}) for item in
                 post_data]
    print(post_list)
    # grequests.map(post_list, size=20, exception_handler=g_handler)
    # logging.debug('async post successfully:data_count={}'.format(len(post_data)))

def process_msg():
    # data = json.loads(msg.value.decode('utf-8'))
    # print('data', data)
    data = {"market_id": 2355, "contract_address": "0x0eD7e52944161450477ee417DE9Cd3a859b14fD0"}
    contract_address = data['contract_address']
    market_id = data['market_id']
    chain_type = dbmt.get_chain_type(market_id)
    print('{} {} {}', market_id, chain_type,contract_address)
    if contract_address and market_id and chain_type:
        print(contract_address)
        pair_contract = DeFiContract(contract_address, 'Pair', chain='bsc')
        # print('{} {}', pair_contract, chain_type)
        token0_address = pair_contract.token0()
        print(token0_address)
        # token0 = DeFiContract(token0_address, 'ERC20', chain='bsc')
        # print('token0' ,token0)
        # try:
        #     decimals0 = token0.decimals()
        # except web3.exceptions.ContractLogicError:
        #     decimals0 = 18
        # except web3.exceptions.BadFunctionCallOutput:
        #     decimals0 = 18
        # token1_address = pair_contract.token1()
        # token1 = DeFiContract(token1_address, 'ERC20', chain='bsc')
        # try:
        #     decimals1 = token1.decimals()
        # except web3.exceptions.ContractLogicError:
        #     decimals1 = 18
        # except web3.exceptions.BadFunctionCallOutput:
        #     decimals1 = 18
        # reserve0, reserve1, _ = pair_contract.getReserves()
        # reserve0 = reserve0 / (10 ** decimals0)
        # reserve1 = reserve1 / (10 ** decimals1)
        #
        # print('{} {}', reserve0, reserve1)
        # token0_price_usd = float(dbmt.get_price(token0_address))
        # token1_price_usd = float(dbmt.get_price(token1_address))
        #
        # if token0_price_usd == 0:
        #     anchor_pro = float('{:.4f}'.format(reserve1 / reserve0)) if reserve0 != 0 else 0
        #     token0_price_usd = float(token1_price_usd * anchor_pro)
        # if token1_price_usd == 0:
        #     anchor_pro = float('{:+.4f}'.format(reserve0 / reserve1)) if reserve1 != 0 else 0
        #     token1_price_usd = float('{:.2f}'.format(anchor_pro * token0_price_usd))
        # lock_amount = float('{:.2f}'.format(reserve0 * token0_price_usd + reserve1 * token1_price_usd))
        # print('{} {} {:>15.2f} {:>15.2f} {} {}'.format(contract_address, reserve0, reserve1, token0_price_usd, token1_price_usd,lock_amount))
        #
        # currency_map = []
        # dict_data = {'market_id': market_id, 'contract_address': contract_address, 'lock_usd': lock_amount}
        # currency_map.append(dict_data)
        # if len(currency_map) > 3:
        #     async_post_to_remote(currency_map)

def run_consumer():
    topic = 'topic_a'
    print(cfg.get('kafka', 'online_brokers'))
    consumer = KafkaConsumer(group_id='group_id_test', bootstrap_servers=cfg.get('kafka', 'online_brokers').split(','))
    consumer.subscribe([topic])
    pool = ProcessPoolExecutor(16)
    for msg in consumer:
        try:
            pool.submit(process_msg, msg)
        except BrokenProcessPool as e:
            logging.info("BrokenProcessPool:{}".format(e))
            continue





if __name__ == '__main__':
    # while True:
    #     run_consumer()
    #     time.sleep(180)
    process_msg()