无限循环有时会中断

时间:2017-07-24 19:07:57

标签: python python-3.x while-loop

我写了一个litte加密切换器,它检查利润和切换矿工。但它工作一段时间后循环停止没有任何错误(它可能工作15分钟或20小时,但它会停止,测试10天)。

代码:

import os
import subprocess
import time
import copy
import requests
import configparser
from datetime import datetime


def config_read ():
    config = configparser.ConfigParser()
    config.read('config.ini')
    return config.sections


def start_miner(info):
    if info['algorithm'] == 'Equihash':
        subprocess.Popen('F:\Claymore\start — music — Peon.bat', cwd='F:\Claymore',
                         creationflags=subprocess.CREATE_NEW_CONSOLE)
    elif info['algorithm'] == 'Ethash':
        subprocess.Popen('F:\Claymore\start — music — Peon.bat', cwd='F:\Claymore',
                         creationflags=subprocess.CREATE_NEW_CONSOLE)
    return info


def stop_miner():
    os.system("taskkill /f /t /im  miner.exe")
    os.system("taskkill /f /t /im  EthDcrMiner64.exe")


def request_coins():
    coins = None
    while coins is None:
        try:
            coins = ((requests.get(
                url='https://whattomine.com/coins.json?utf8=✓&eth=true&factor%5Beth_hr%5D=79.0&factor%5Beth_p%5D=0.0&factor%5Bgro_hr%5D=0.0&factor%5Bgro_p%5D=0.0&factor%5Bx11g_hr%5D=20.0&factor%5Bx11g_p%5D=0.0&factor%5Bcn_hr%5D=0.0&factor%5Bcn_p%5D=0.0&eq=true&factor%5Beq_hr%5D=1000.0&factor%5Beq_p%5D=0.0&factor%5Blrev2_hr%5D=80000.0&factor%5Blrev2_p%5D=0.0&factor%5Bns_hr%5D=0.0&factor%5Bns_p%5D=0.0&factor%5Blbry_hr%5D=0.0&factor%5Blbry_p%5D=0.0&factor%5Bbk2b_hr%5D=0.0&factor%5Bbk2b_p%5D=0.0&factor%5Bbk14_hr%5D=0.0&factor%5Bbk14_p%5D=0.0&factor%5Bpas_hr%5D=0.0&factor%5Bpas_p%5D=0.0&bkv=true&factor%5Bbkv_hr%5D=0.0&factor%5Bbkv_p%5D=0.0&factor%5Bcost%5D=0.06&sort=Profitability24&volume=0&revenue=24h&factor%5Bexchanges%5D%5B%5D=&factor%5Bexchanges%5D%5B%5D=bittrex&factor%5Bexchanges%5D%5B%5D=bleutrade&factor%5Bexchanges%5D%5B%5D=btc_e&factor%5Bexchanges%5D%5B%5D=bter&factor%5Bexchanges%5D%5B%5D=c_cex&factor%5Bexchanges%5D%5B%5D=cryptopia&factor%5Bexchanges%5D%5B%5D=poloniex&factor%5Bexchanges%5D%5B%5D=yobit&dataset=Main&commit=Calculate&adapt_q_280x=0&adapt_q_380=0&adapt_q_fury=0&adapt_q_470=0&adapt_q_480=0&adapt_q_750Ti=0&adapt_q_10606=3&adapt_q_1070=0&adapt_q_1080=0&adapt_q_1080Ti=0%27')).json())[
            'coins']
        except:
            print("Site didn't respond. Reconnecting in 10 sec")
            time.sleep(10)
    return coins


def miner_chose(config, info):
    user_coins = {}
    coins = request_coins()
    for key, value in config['Currency'].items():
        if value == 'True':
            tag = key.upper()
            for key_coin, value_coin in coins.items():
                if value_coin['tag'] == info['temp_currency']:
                    info['temp_profit'] = value_coin['btc_revenue24']
                if value_coin['tag'] == info['currency']:
                    info['profit'] = value_coin['btc_revenue24']
                if value_coin['tag'] == tag:
                    user_coins[key_coin] = value_coin
    for key, value in user_coins.items():
        if float(value['btc_revenue24']) >= float(info['profit']) * (float(config['CheckOptions']['profitprocent']) +100) / 100:
            if not info['currency'] == value['tag']:
                if float(value['btc_revenue24']) > float(info['temp_profit']):
                    if not info['temp_currency'] == value['tag']:
                        info['check_times'] = 0
                    info['temp_profit'] = value['btc_revenue24']
                    info['temp_currency'] = value['tag']
                info['check_times'] += 1
                if int(info['check_times']) >= int(config['CheckOptions']['times']):
                    info['profit'] = value['btc_revenue24']
                    info['currency'] = value['tag']
                    info['algorithm'] = value['algorithm']
                    info['check_times'] = 0
    return info

使用while循环和停止的部分代码:

def main():
    info = {'profit': 0, 'check_times': 200, 'currency': None, 'temp_profit': 0, 'temp_currency': None}
    config = config_read()

    while True:
        if info['profit'] == 0:
            stop_miner()
            info = start_miner(miner_chose(config,info))
            print(str(datetime.now()) + " - Starting miner first time. Currency: " + info['currency'] + '. Profit: ' +
                  info['profit'] + ' BTC/Day')
            time.sleep(int(config['CheckOptions']['period']) * 60)
        else:
            old_info = copy.deepcopy(info)
            info = miner_chose(config, info)
            print(
                str(datetime.now()) + ' - Checking profit. Current currency: ' + info['currency'] + '. Profit: ' + info[
                    'profit'] + ' BTC/Day')
            if info['currency'] != old_info['currency']:
                print('Changing miner. Currency ' + info['currency'] + '. Profit: ' + info['profit'] + ' BTC/Day')
            elif info['currency'] == old_info['currency']:
                print('Curency SAME')
                # stop_miner()
                # start_miner(info)
            time.sleep(int(config['CheckOptions']['period']) * 60)

我希望睡眠后time.sleep(int(config['CheckOptions']['period']) * 60)脚本必须重新开始并再次进行检查,但有时脚本会睡觉,因为我已经放入配置并且不想再次检查。它可能会在10或20次检查后停止,没有任何错误。

1 个答案:

答案 0 :(得分:0)

需要添加到coins = ((requests.get(url='https://whattomine.com/coins.json', timeout=3)).json())['coins']导致服务器堆栈并且不发送响应。