Python: raw_input и печать в потоке - PullRequest
3 голосов
/ 14 января 2012

У меня есть нить, которая может печатать текст на консоли, а основная программа имеет raw_input для управления нитью.

Моя проблема в том, что когда я пишу, и нить тоже что-то получаювот так:

-->whatiwWHATTHETHREADWRITErite

но я бы хотел получить что-то вроде этого

WHATTHETHREADWRITE
-->whatiwrite

Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 января 2012

Вы можете создать блокировку и выполнить весь ввод и вывод, удерживая блокировку:

import threading

stdout_lock = threading.Lock()

with stdout_lock:
    r = raw_input()

with stdout_lock:
    print "something"
2 голосов
/ 14 января 2012

Вы должны синхронизировать свой вход с выходом потока, предотвращая их одновременное выполнение.

Вы можете изменить основной цикл, например:

lock = threading.lock()

while 1:
    raw_input()     # Waiting for you to press Enter
    with lock:
        r = raw_input('--> ')
        # send your command to the thread

И затем заблокировать фонпечать нити:

def worker(lock, ...):
    [...]
    with lock:
        print('what the thread write')

Короче, когда вы Press Enter остановите нить и войдете в «режим ввода».

Точнее, каждыйкогда вы Press Enter будете:

  • ждать, пока блокировка не станет доступной
  • получить блокировку
  • print --> и ждать команды
  • вставить вашу команду
  • отправить эту команду в поток
  • снять блокировку

Таким образом, ваш поток будет остановлен, только если он попытаетсядля печати, когда вы находитесь в «режиме ввода» ,
и в вашем терминале вы получите что-то вроде:

some previous output

---> your input
THE THREAD OUTPUT
0 голосов
/ 14 января 2012

Используйте что-то вроде curses , чтобы записать вывод фоновой задачи на половину экрана, а ваши элементы ввода / управления - на другую половину.

Вы также можете играть с ANSI escapeкоды на большинстве терминалов.

...