Masukan berwaktu Python

Oct 14 2020

Saya sedang menulis bot-game python di mana pengguna perlu mengirimkan input dalam jangka waktu tertentu.

Implementasi saya saat ini adalah menelurkan utas baru yang tidur selama jumlah waktu itu, lalu memeriksa apakah input telah dikirim. Nonce ditambahkan karena waktu dapat habis setelah utas lain dimulai yang akan menyebabkan if chatid in user_threadsbagian dievaluasi menjadi benar. Haruskah saya menggunakan metode ini atau apakah ada solusi yang lebih baik untuk memiliki masukan berwaktu (dalam arti lebih kecil kemungkinannya untuk gagal karena kondisi balapan yang sama).

Saya juga mencoba menggunakan multiprocessing.Processtetapi berbagi variabel ke proses lain tampaknya jauh lebih rumit.

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")

Jawaban

2 Reinderien Oct 14 2020 at 00:41

Apa yang dikatakan @vnp. Pada dasarnya,

  • inputpenggunaan stdin;
  • stdin dapat diartikan sebagai file handle selama Anda tidak menggunakan Windows;
  • select bisa menunggu ketersediaan data pada tuas tersebut.

Ada banyak bantuan internet tentang topik ini, termasuk https://stackoverflow.com/a/3471853/313768; mengutip solusi di sana:

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..."