Python zamanlı giriş

Oct 14 2020

Bir kullanıcının belirli bir süre içinde bir girdi göndermesi gereken bir python oyun botu yazıyorum.

Bunun şu anki uygulamam, bu süre boyunca uyuyan yeni bir iş parçacığı oluşturmak ve ardından bir giriş gönderilip gönderilmediğini kontrol etmek. Başka bir iş parçacığı başladıktan sonra süre bitebileceğinden, if chatid in user_threadsparçanın doğru olarak değerlendirilmesine neden olacağından bir nonce eklenir . Bu yöntemi kullanmalı mıyım yoksa zamanlanmış bir girişe sahip olmak için daha iyi bir çözüm var mı (benzer yarış koşullarından dolayı başarısız olma olasılığı daha düşüktür).

Ayrıca kullanmayı denedim, multiprocessing.Processancak değişkenleri diğer işlemle paylaşmak çok daha külfetli görünüyor.

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

Yanıtlar

2 Reinderien Oct 14 2020 at 00:41

@Vnp ne dedi. Temelde,

  • inputkullanır stdin;
  • stdin Windows'ta olmadığınız sürece bir dosya tanıtıcısı olarak yorumlanabilir;
  • select bu tür tanıtıcılarda veri kullanılabilirliğini bekleyebilir.

Bu konuda birçok internet yardımı var: https://stackoverflow.com/a/3471853/313768; çözümü orada alıntı yapmak için:

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