首页 > 解决方案 > 试图同时运行两个线程。出于某种原因,只有一个在工作。Python

问题描述

我目前正在制作一个机器人,将加密价格和信号目标信号发送到我的不和谐服务器中。问题是,我正在尝试运行几个无休止的循环(目前是 3 个),这些循环都需要同时处于活动状态。我正在运行三个主要的 Python 文件。最近,当它只是我的 Discord 循环和我的 Eth_Socket(代码位于页面下方)时,一切正常,可悲的是,当我添加 Trx_Socket 时,Trx_Socket.py 中的代码永远不会启动

我将在下面插入代码,以便您可以按照我要解释的内容进行操作

Pythong 文件 1(名称:main)

import os
import discord
import requests
import json
from binance.client import Client
import time
from time import sleep
import websocket
from multiprocessing import Process
import asyncio
import threading
from discord.ext import tasks, commands
#Socket Imports
import Eth_Socket
import Trx_Socket





DToken = 'CENSORED'
dclient = discord.Client()



#Coin Analasys
#How to add socket: just do <name> = "wss://stream.binance.com/ws/<symbol>@kline_<interval>
#Eth_Sock = "wss://stream.binance.com:9443/ws/ethusdt@kline_1m"



# pip install python-binance
# pip install --upgrade pip
# pip install TA-Lib

@dclient.event
async def on_ready():
    print("We have logged in as {0.user}".format(dclient))

    #Channels:
    HRC = dclient.get_channel(CENSORED)
    MRC = dclient.get_channel(CENSORED)
    LRC = dclient.get_channel(CENSORED)
    GSB = dclient.get_channel(CENSORED)
    VIP = dclient.get_channel(CENSORED)

    while True:

        #Eth Signal
        if Eth_Socket.EthEntryConfirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nEntry: :white_check_mark:')
            Eth_Socket.EthEntryConfirm = 2
        if Eth_Socket.EthTp1Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 1: :white_check_mark:')
            Eth_Socket.EthTp1Confirm = 2
        if Eth_Socket.EthTp2Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 2: :white_check_mark:')
            Eth_Socket.EthTp2Confirm = 2
        if Eth_Socket.EthTp3Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 3: :white_check_mark:')
            Eth_Socket.EthTp3Confirm = 2
        if Eth_Socket.EthTp4Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 4: :white_check_mark:')
            Eth_Socket.EthTp4Confirm = 2
        if Eth_Socket.EthTp5Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 5: :white_check_mark:')
            Eth_Socket.EthTp5Confirm = 2
        if Eth_Socket.EthTp6Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 6: :white_check_mark:')
            Eth_Socket.EthTp6Confirm = 2
        if Eth_Socket.EthTp7Confirm == 1:
            await VIP.send('<@&CENSORED> \n [Eth - USDT] Short \nTp 7: :white_check_mark:')
            Eth_Socket.EthTp1Confirm = 2



@dclient.event
async def on_message(message):
    Eth = Eth_Socket.eth_int

    if message.author == dclient.user:
        return

    if message.content.startswith("$hello"):
        await message.channel.send('Hello')

    if message.content.startswith("$eth"):
        await message.channel.send(Eth)



#PDiscord = threading.Thread(target=dclient.run(DToken))



if __name__ == '__main__':
    global DLoop
    DLoop = asyncio.get_event_loop()
    DLoop.create_task(dclient.start(DToken))
    DThread = threading.Thread(target=DLoop.run_forever) 
    DThread.start()

    global EthLoop
    EthLoop = asyncio.get_event_loop()
    EthLoop.create_task(Eth_Socket.ws_Eth.run_forever()) #I AM TALKING ABOUT THIS <--
    EthThread = threading.Thread(target=EthLoop)


    TrxLoop = asyncio.get_event_loop()
    TrxLoop.create_task(Trx_Socket.ws_Trx.run_forever())
    TrxThread = threading.Thread(target=TrxLoop)


    TrxThread.start()
    EthThread.start()

通过测试,我意识到如果我删除代码行“EthLoop.create_task(Eth_Socket.ws_Eth.run_forever())”下的所有内容,该代码看起来与下面的所有内容完全相同,它永远不会被调用到函数中。

这是第二个文件(名称:Eth_Socket)

import websocket
import os
import discord
import requests
import json
from time import time
from time import sleep
import Eth_Socket
import asyncio
from multiprocessing import Process

import main

Eth_Sock = "wss://stream.binance.com:9443/ws/ethusdt@kline_1m"

#Signal Targets
EthEntry = 0
EthTp1 = 2800
EthTp2 = 2610
EthTp3 = 2450
EthTp4 = 2305
EthTp5 = 2180
EthTp6 = 2080
EthTp7 = 1965
EthSL = 3050

#Confirmation for Main
global eth_int
global EthEntryConfirm
EthEntryConfirm = 0
EthTp1Confirm = 0
EthTp2Confirm = 0
EthTp3Confirm = 0
EthTp4Confirm = 0
EthTp5Confirm = 0
EthTp6Confirm = 0
EthTp7Confirm = 0
EthSLConfirm = 0

def on_open(ws_Eth):
    print('ETH: opened connection')

def on_close(ws_Eth):
    print('ETH: closed connection')

def eth_message(ws_Eth, message):
    json_ethmessage = json.loads(message)
    eth_candle = json_ethmessage['k']
    global eth_close
    eth_close = eth_candle['c']
    global eth_int
    eth_int = json.loads(eth_close)

    #if functions
    if EthEntry <= eth_int and Eth_Socket.EthEntryConfirm == 0:
        print("ETH: Entry Command!")
        Eth_Socket.EthEntryConfirm = 1

    if EthTp1 >= eth_int and Eth_Socket.EthEntryConfirm == 1:
        print("ETH: Tp1 Command!")
        Eth_Socket.EthTp1Confirm = 1

    if EthTp2 >= eth_int and Eth_Socket.EthTp1Confirm == 1:
        print("ETH: Tp2 Command")
        Eth_Socket.EthTp2Confirm = 1

    if EthTp3 >= eth_int and Eth_Socket.EthTp2Confirm == 1:
        print("ETH: Tp3 Command")
        Eth_Socket.EthTp3Confirm = 1

    if EthTp4 >= eth_int and Eth_Socket.EthTp3Confirm == 1:
        print("ETH: Tp4 Command")
        Eth_Socket.EthTp4Confirm = 1

    if EthTp5 >= eth_int and Eth_Socket.EthTp4Confirm == 1:
        print("ETH: Tp5 Command")
        Eth_Socket.EthTp5Confirm = 1

    if EthTp6 >= eth_int and Eth_Socket.EthTp5Confirm == 1:
        print("ETH: Tp6 Command")
        Eth_Socket.EthTp6Confirm = 1

    if EthTp7 >= eth_int and Eth_Socket.EthTp6Confirm == 1:
        print("ETH: Tp7 Command")
        Eth_Socket.EthTp7Confirm = 1

    sleep(1)


ws_Eth = websocket.WebSocketApp(Eth_Sock, on_open=on_open, on_close=on_close, on_message=eth_message)

第三个文件(名称:Trx_Socket)

import websocket
import os
import discord
import requests
import json
from time import time
from time import sleep
import Trx_Socket
import asyncio
from multiprocessing import Process

import main

Trx_Sock = "wss://stream.binance.com:9443/ws/trxusdt@kline_1m"

#Signal Targets
TrxEntry = 0.08
TrxTp1 = 0.075
TrxTp2 = 0.072
TrxTp3 = 0.068
TrxTp4 = 0.066
TrxTp5 = 0.062
TrxTp6 = 0.059
TrxTp7 = 0.057
TrxTp8 = 0.055
TrxSL = 0.0851

#Confirmation for Main
global Trx_int
global TrxEntryConfirm
TrxEntryConfirm = 0
TrxTp1Confirm = 0
TrxTp2Confirm = 0
TrxTp3Confirm = 0
TrxTp4Confirm = 0
TrxTp5Confirm = 0
TrxTp6Confirm = 0
TrxTp7Confirm = 0
TrxTp8Confirm = 0
TrxSLConfirm = 0

def on_open(ws_Trx):
    print('TRX: opened connection')

def on_close(ws_Trx):
    print('TRX: closed connection')

def trx_message(ws_Trx, message):
    json_trxmessage = json.loads(message)
    trx_candle = json_trxmessage['k']
    global trx_close
    trx_close = trx_candle['c']
    global trx_int
    trx_int = json.loads(trx_close)

    #if functions
    if TrxEntry <= trx_int and Trx_Socket.TrxEntryConfirm == 0:
        print("TRX: Entry Command!")
        Trx_Socket.TrxEntryConfirm = 1

    if TrxTp1 >= trx_int and Trx_Socket.TrxEntryConfirm == 1:
        print("TRX: Tp1 Command!")
        Trx_Socket.TrxTp1Confirm = 1

    if TrxTp2 >= trx_int and Trx_Socket.TrxTp1Confirm == 1:
        print("TRX: Tp2 Command")
        Trx_Socket.TrxTp2Confirm = 1

    if TrxTp3 >= trx_int and Trx_Socket.TrxTp2Confirm == 1:
        print("TRX: Tp3 Command")
        Trx_Socket.TrxTp3Confirm = 1

    if TrxTp4 >= trx_int and Trx_Socket.TrxTp3Confirm == 1:
        print("TRX: Tp4 Command")
        Trx_Socket.TrxTp4Confirm = 1

    if TrxTp5 >= trx_int and Trx_Socket.TrxTp4Confirm == 1:
        print("TRX: Tp5 Command")
        Trx_Socket.TrxTp5Confirm = 1

    if TrxTp6 >= trx_int and Trx_Socket.TrxTp5Confirm == 1:
        print("TRX: Tp6 Command")
        Trx_Socket.TrxTp6Confirm = 1

    if TrxTp7 >= trx_int and Trx_Socket.TrxTp6Confirm == 1:
        print("TRX: Tp7 Command")
        Trx_Socket.TrxTp7Confirm = 1

    if TrxTp8 >= trx_int and Trx_Socket.TrxTp7Confirm == 1:
        print("TRX: Tp8 Command")
        Trx_Socket.TrxTp8Confirm = 1

    sleep(1)


ws_Trx = websocket.WebSocketApp(Trx_Sock, on_open=on_open, on_close=on_close, on_message=trx_message)

此外,我确信有一些方法可以清理代码等,但目前我更感兴趣的是了解我到底做错了什么以及我能做些什么来解决这个问题。我正在寻找的是,来自 Eth_Socket 和 Trx_Socket 的代码可以同时运行。有趣的是,DClient(discord 客户端)能够与 Eth_Socket(函数)同时运行

标签: python-3.xmultithreadingloopsdiscordcryptocurrency

解决方案


推荐阅读