93 lines
2.3 KiB
Python
93 lines
2.3 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
from __future__ import with_statement
|
||
|
import vim
|
||
|
import os
|
||
|
import subprocess
|
||
|
import threading
|
||
|
import Queue
|
||
|
|
||
|
|
||
|
class Asyncer:
|
||
|
|
||
|
def __init__(self):
|
||
|
self._workers = {}
|
||
|
|
||
|
def execute(self, var_key, var_command, var_cwd, var_input, var_appends):
|
||
|
key = vim.eval(var_key)
|
||
|
command = vim.eval(var_command)
|
||
|
cwd = vim.eval(var_cwd)
|
||
|
input = vim.eval(var_input)
|
||
|
appends = vim.eval(var_appends)
|
||
|
if key not in self._workers:
|
||
|
self._workers[key] = Worker()
|
||
|
self._workers[key].start()
|
||
|
self._workers[key].put(Executor(command, cwd, input, appends))
|
||
|
|
||
|
def print_output(self, var_key):
|
||
|
key = vim.eval(var_key)
|
||
|
if key not in self._workers:
|
||
|
return
|
||
|
for l in self._workers[key].copy_outputs():
|
||
|
print l,
|
||
|
|
||
|
def print_worker_keys(self):
|
||
|
for k in self._workers.keys():
|
||
|
print k
|
||
|
|
||
|
def print_active_worker_keys(self):
|
||
|
for k in self._workers.keys():
|
||
|
print k
|
||
|
|
||
|
|
||
|
class Worker(threading.Thread):
|
||
|
|
||
|
def __init__(self):
|
||
|
threading.Thread.__init__(self)
|
||
|
self._queue = Queue.Queue()
|
||
|
self._lines = []
|
||
|
self._lock = threading.Lock()
|
||
|
|
||
|
def run(self):
|
||
|
while True:
|
||
|
self._queue.get().execute(self)
|
||
|
self._queue.task_done()
|
||
|
|
||
|
def put(self, executor):
|
||
|
self._queue.put(executor)
|
||
|
|
||
|
def clear_outputs(self):
|
||
|
with self._lock:
|
||
|
self._lines = []
|
||
|
|
||
|
def record_output(self, line):
|
||
|
with self._lock:
|
||
|
self._lines.append(line)
|
||
|
|
||
|
def copy_outputs(self):
|
||
|
with self._lock:
|
||
|
return self._lines[:]
|
||
|
|
||
|
|
||
|
class Executor:
|
||
|
|
||
|
def __init__(self, command, cwd, input, appends):
|
||
|
self._command = command
|
||
|
self._cwd = cwd
|
||
|
self._input = input
|
||
|
self._appends = appends
|
||
|
|
||
|
def execute(self, worker):
|
||
|
if not self._appends:
|
||
|
worker.clear_outputs()
|
||
|
os.chdir(self._cwd)
|
||
|
p = subprocess.Popen(self._command, shell=True, stdin=subprocess.PIPE,
|
||
|
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||
|
p.stdin.write(self._input)
|
||
|
line = p.stdout.readline()
|
||
|
while line:
|
||
|
worker.record_output(line)
|
||
|
line = p.stdout.readline()
|
||
|
|
||
|
|