Python 시간 입력

Oct 14 2020

사용자가 일정 시간 내에 입력을 보내야하는 파이썬 게임 봇을 작성 중입니다.

내 현재 구현은 해당 시간 동안 잠자는 새 스레드를 생성 한 다음 입력이 전송되었는지 확인하는 것입니다. 다른 스레드가 시작된 후 시간이 부족하여 if chatid in user_threads부품이 참으로 평가 될 수 있으므로 임시 값이 추가됩니다 . 이 방법을 사용해야할까요 아니면 시간 제한 입력을 갖는 더 나은 솔루션이 있습니까 (같은 경쟁 조건으로 인해 실패 할 가능성이 적다는 의미에서).

나는 또한 사용해 multiprocessing.Process보았지만 변수를 다른 프로세스와 공유하는 것이 훨씬 더 번거로운 것 같습니다.

from threading import Thread
from time import time, sleep
from random import randint

user_threads = {}

def timeout(t,r):
    while time()-t<5:
        sleep(5-time()+t)
    if chatid in user_threads:
        if user_threads[chatid][3] != r:
            return
        del user_threads[chatid]
        print("Too slow")

def recvans(ans,inp):
    if ans==inp:
        print("yes")
    else:
        print("no")

def starttimer(chatid):
    r = randint(0,1<<128)
    user_threads[chatid] = [None,None,None,r]
    user_threads[chatid][2] = ["a"]
    P = Thread(target = timeout, args = (time(),r))
    user_threads[chatid][0] = P
    user_threads[chatid][1] = recvans
    P.start()

while True: # simulating user input from different users (here chatid=1)
    inp = input()
    chatid = 1
    if chatid in user_threads:
        t, func, args, _ = user_threads[chatid]
        if t == None:
            print("Please wait")
            continue
        del user_threads[chatid]
        args += [inp]
        func(*args)
        continue
    if inp == "Start":
        starttimer(chatid)
        continue
    if inp == "Quit":
        break
    print("Unknown msg")

답변

2 Reinderien Oct 14 2020 at 00:41

@vnp가 말한 것. 기본적으로

  • input사용 stdin;
  • stdin Windows를 사용하지 않는 한 파일 핸들로 해석 될 수 있습니다.
  • select 이러한 핸들에서 데이터 가용성을 기다릴 수 있습니다.

이 주제에 대한 많은 인터넷 도움말이 있습니다. https://stackoverflow.com/a/3471853/313768; 거기에 해결책을 인용하십시오.

import sys 
from select import select

timeout = 10 
print "Enter something:", 
rlist, _, _ = select([sys.stdin], [], [], timeout) 
if rlist:
    s = sys.stdin.readline()
    print s 
else:
    print "No input. Moving on..."