파이썬 비동기 함수를 스레드에서 돌리는거에 관해 관해 질문드립니다. (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 된 적이 없다며 오류가 뜹니다.)

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 메인 코드와 별개로 작동하는거라면 멀티쓰레딩보다는 멀티프로세싱이 낫지 않나 생각합니다. 초보자 2021.6.9 09:33
  • 한 가지 궁금한 게 있는데, if not line: 이면 line을 뭐랑 비교하는 건가요? 초보자 2021.6.9 09:33
  • 텍스트 파일에 자가진단을 할 사람들 목록이 저장되어있는데, 텍스트 파일을 끝까지 읽어오고 줄이 더 이상 없을 때 if not line: 을 통해 break를 하게했습니다. 알 수 없는 사용자 2021.6.9 09:38
  • 멀티 프로세싱과 멀티쓰레딩은 무슨차이인가요? 알 수 없는 사용자 2021.6.9 09:39
  • 멀티 프로세싱은 여러개의 코어를 활용하는 거고 멀티쓰레딩은 하나의 코어에서 작업 순서만 조절하는걸로 알고 있습니다. 초보자 2021.6.9 10:38

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)