อินพุตที่กำหนดเวลาของ Python

Oct 14 2020

ฉันกำลังเขียน python game-bot ที่ผู้ใช้ต้องส่งอินพุตภายในระยะเวลาหนึ่ง

การใช้งานในปัจจุบันของฉันคือการสร้างเธรดใหม่ที่สลีปตามระยะเวลานั้นจากนั้นตรวจสอบว่ามีการส่งอินพุตหรือไม่ มีการเพิ่ม nonce เนื่องจากเวลาอาจหมดลงหลังจากเธรดอื่นเริ่มต้นซึ่งจะทำให้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..."