파이썬 비동기 함수를 스레드에서 돌리는거에 관해 관해 질문드립니다. (discord.py)
조회수 1259회
#-*- coding: utf-8 -*-
print('라쿠닝 준비 중.. 패키지들을 불러오는 중입니다.. ')
import discord
import time
from discord.ext import commands
import hcskr #자가진단 라이브러리
import asyncio
import random
import requests
import os, subprocess
import re
import youtube_dl
import fileinput
import sys
from discord.utils import get
from bs4 import BeautifulSoup
from PIL import Image
import datetime
import threading
async def time_autocheck(): #자가진단 자동코드, 이걸 스레드에서 어떻게 돌리죠?
f = open('SelfCheckInfo.txt', 'r', encoding='UTF-8')
list = []
names = []
results = []
while True:
line = f.readline() #파일 읽기
if not line:
break
line = line.split(' ') #공백 단위로 잘라서 list로 만듬
line[5] = line[5][:-1] #비밀번호란의 \n을 삭제
name = line[0]
birth = line[1]
region = line[2]
school_name = line[3]
level = line[4]
password = line[5]
INFO = [name, birth, region, school_name, level, password]
list.append(INFO)
print(list)
f.close()
while True:
if datetime.datetime.now().hour == 8 and datetime.datetime.now().minute == 25:
for i in range(0, len(list)):
INFO = list[i]
result = await hcskr.asyncSelfCheck(INFO[0], INFO[1], INFO[2], INFO[3], INFO[4], INFO[5])
names.append(INFO[0])
results.append(result['message'])
print(result)
break
channel = bot.get_channel(842988208756752386)
userlist = ''
for i in range(0, len(list)):
userlist = userlist + list[i][0] + ' : ' + '``' + results[i] + '``' + '\n'
await channel.send(embed=discord.Embed(title="``라쿠닝 자동 자가진단 서비스``\n 다음은 자동으로 자가진단을 시행한 유저들의 목록입니다", description=userlist, colour=0x00FFFF))
intents = discord.Intents.default() #봇이 서버 멤버를 추적하거나 전체 멤버 목록을 다운하는 경우 멤버 이벤트와 멤버 목록을 수신하려면 server member intent가 필요함.
#라쿠닝에서는 신규 멤버 가입 시 가입인사를 해주는 코드의 작동 위해 필요함
intents.members = True
bot = commands.Bot(command_prefix='*',status=discord.Status.online, activity=discord.Game("아이유 덕질"), intents=intents) #상태메세지 (종류: Game, Streaming, CustomActivity)
#프로그램 초기구성
@bot.event
async def on_ready():
print('라쿠닝 준비 완료!')
print('\n\n[LOG]\n')
await time_autocheck()
지금 디스코드 봇으로 8시 25분이 되면 자동으로 자가진단을 하는 프로그램을 만들고 있습니다. 그냥 동기 함수로 하면 쉽게 되지만, discord.py에서 디스코드에 알림을 보내려면 함수를 무조건 비동기로 만들어야 되더라고요. 위 코드처럼 코딩하면 비동기 함수가 끝나기 전까지 프로그램이 멈춰있습니다. 스레드를 이용해야할것같은데, 비동기 함수를 어떻게 스레드에서 돌리는지 모르겠어서 이렇게 질문드립니다.
thread = threading.Thread(Target = time_autocheck)
thread.start()
(이렇게 스레드에 넣으려 하면 awaited 된 적이 없다며 오류가 뜹니다.)
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력