Entrada cronometrada de Python -- python campo con multithreading camp codereview Relacionados El problema

Python timed input


3
vote

problema

Español

Estoy escribiendo un bot-bot de Python donde un usuario necesita enviar una entrada dentro de una cierta cantidad de tiempo.

Mi implementación actual de esto es generar un nuevo hilo que duerme por esa cantidad de tiempo, luego verifica si se ha enviado una entrada. Se agrega una no medida, ya que el tiempo podría agotarse después de que se inicie otro hilo, lo que causaría la parte 9988777666655443315 para evaluar con verdadero. Si debo usar este método o hay una mejor solución para tener una entrada cronometrada (en el sentido menos probable que falle debido a las condiciones de carrera).

También he intentado usar {ABC, ["Simon", "John"]} {DEF, ["Simon"]} {XYZ, ["John"]} 6 pero compartir variables al otro proceso parece ser mucho más engorroso.

  {ABC,     ["Simon", "John"]} {DEF,     ["Simon"]} {XYZ,     ["John"]} 7  
Original en ingles

I'm writing a python game-bot where a user needs to send in an input within a certain amount of time.

My current implementation of this is to spawn a new thread that sleeps for that amount of time, then checks if an input has been sent. A nonce is added as the time could run out after another thread starts which would cause the if chatid in user_threads part to evaluate to true. Should I use this method or is there a better solution to having a timed input (in the sense less likely to fail due to like race conditions).

I've also tried using multiprocessing.Process but sharing variables to the other process seems to be a lot more cumbersome.

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

Lista de respuestas

2
 
vote

lo que dijo @vnp. Fundamentalmente,

  • long15 usa long16 ;
  • long17 se puede interpretar como un mango de archivo siempre que no esté en Windows;
  • long18 puede esperar la disponibilidad de datos en tales asas.

Hay mucha ayuda a Internet en este tema, incluida https://stackoverflow.com/a/3471853/313768; Para citar la solución allí:

  long19  
 

What @vnp said. Fundamentally,

  • input uses stdin;
  • stdin can be interpreted as a file handle so long as you're not in Windows;
  • select can wait for data availability on such handles.

There's a lot of internet help on this topic, including https://stackoverflow.com/a/3471853/313768 ; to quote the solution there:

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

Relacionados problema

8  Prueba de registro multithread  ( Multithreaded log test ) 
Estoy escribiendo una extensión de registrador que permite que varios subprocesos registren un proceso, y luego voltee ese registro en el registro principal e...

3  Generador de imágenes de Mandelbrot con iteración paralela  ( Mandelbrot image generator with parallel iteration ) 
Actualmente estoy tratando de optimizar esta clase que tengo para la generación fractal. La ecuación está destinada a ser conectable; He usado z => z*z + c ...

2  Cola de bloqueo delimitada  ( Bounded blocking queue ) 
¿Puede alguien por favor revise este código para mí? No he implementado todos los métodos para la simplicidad. NSUSerDefaults1 Preguntas abiertas: l...

5  Alcanzar un objeto grande en el entorno multithreading  ( Caching large object in multithreading environment ) 
Estoy teniendo que desbordarse con el almacenamiento en caché y el multithreading (hilo por solicitud), y soy un principiante absoluto en esa área, por lo que...

4  Programador de tareas de flujo  ( Flow task scheduler ) 
escenario : Quería un programador de tareas / Duende que permite que mi aplicación programe algunas tareas que se ejecuten en un tiempo específico pero e...

2  Prealización de memoria multi-roscada  ( Multi threaded memory preallocation ) 
Necesito averiguar la mejor manera de lidiar con la asignación previa a la memoria A continuación se muestra el pseudo-código para lo que estoy haciendo aho...

5  Contando letras lo más rápido posible  ( Counting letters as quickly as possible ) 
Recibí una tarea, de tomar un archivo de texto conocido (Diccionario de Linux), use hilos para contar las diferentes letras en ella y presentar los resultados...

6  Un pequeño módulo para manejar actualizaciones de texto  ( A tiny module for handling text updates ) 
Llame a estas actualizaciones de texto "Feeds". Un objeto Feed tiene algunos atributos básicos como su cadena de contenido, cuántas vidas tiene y su priorid...

2  Programa de productores / consumidores  ( Producer consumer program ) 
Soy un programador de Java semi-nuevo que tiende a ser un perfeccionista. Lo que me gustaría saber sobre mi código: cómo se compara con la práctica común. ...

4  Conexión a la red Haskell Handler agraciado  ( Haskell network connection graceful handler ) 
Simplemente tratando de resolver un simple código de manejo de conexiones elegante en Haskell para obtener la cabeza alrededor de algunas de las cosas de IO /...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos