Как можно использовать Python в Vim?

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

Асинхронные методы на C # 5 приводятся в действие путем эффективного измельчения метода на куски под капотом и возвращения Task, который может отслеживать общее завершение всего шабанга. Однако, как выполняются методы прерывания, может зависеть от типа выражения, переданного оператору await.

В большинстве случаев вы будете использовать await для выражения типа Task. Выполнение задачи await шаблона является «умным», поскольку оно отбрасывает SynchronizationContext, что в основном приводит к следующему:

  1. Если поток, входящий в await, включен поток потока сообщений диспетчера или WinForms, он гарантирует, что куски асинхронного метода выполняются как часть обработки очереди сообщений.
  2. Если поток, входящий в await, находится в потоке пула потоков, то оставшиеся куски асинхронного метода встречаются в любом месте пула потоков.

Вот почему вы, вероятно, сталкиваетесь с проблемами - реализация метода асинхронного тестирования пытается запустить остальные на диспетчере - даже если он приостановлен.

.... резервное копирование! ....

Я должен задать вопрос, , почему вы пытаетесь синхронно блокировать метод async? Это может привести к тому, что метод будет вызван асинхронно. В общем случае, когда вы начинаете использовать await в методе Dispatcher или UI, вам нужно будет перевернуть весь ваш асинхронный поток пользовательского интерфейса. Например, если ваш столбец был примерно таким:

  1. [Вверх] WebRequest.GetResponse()
  2. YourCode.HelperMethod()
  3. YourCode.AnotherMethod()
  4. YourCode.EventHandlerMethod()
  5. [UI Code].Plumbing() - WPF или WinForms Код
  6. [Message Loop] - WPF или WinForms Message Loop

Затем, как только код был преобразован для использования async, вы, как правило, получите

  1. [Вверх] WebRequest.GetResponseAsync()
  2. YourCode.HelperMethodAsync()
  3. YourCode.AnotherMethodAsync()
  4. YourCode.EventHandlerMethodAsync()
  5. [UI Code].Plumbing() - WPF или WinForms Код
  6. [ Message Loop] - WPF или WinForms Message Loop

Фактически Ответ

Класс AsyncHelpers выше фактически работает, потому что он ведет себя как вложенный цикл сообщений, но он устанавливает свой собственный параллельный механизм в диспетчер, вместо того, чтобы пытаться выполнить сам Диспетчер. Это один из способов решения вашей проблемы.

Другим обходным решением является выполнение вашего асинхронного метода в потоке threadpool, а затем дождаться его завершения. Делать это легко - вы можете сделать это со следующим фрагментом:

var customerList = TaskEx.RunEx(GetCustomers).Result;

Конечным API будет Task.Run (...), но с CTP вам понадобятся суффиксы Ex ( здесь ).

51
задан Léo Léopold Hertz 준영 1 February 2009 в 22:16
поделиться

8 ответов

В любом из Ваших окон энергии введите что-то вроде этого:

for x in range(1,10):
    print '-> %d' % x

Визуально выбор обе из тех строк (V для запуска визуального режима), и вводят следующее:

:!python

, поскольку Вы нажали ':' в визуальном режиме, который закончит тем, что был похож:

:'<,'>!python

Хит входит, и выбор заменяется выводом эти print операторы. Вы могли легко превратить его в отображение:

:vnoremap <f5> :!python<CR>
165
ответ дан too much php 7 November 2019 в 19:43
поделиться

Я думаю you't, просто отсутствующий эти -c флаг. Например:

:.!python -c "print 'hello'"

Вы не должны, что сценарий, что Вы обеспечиваете действия как фильтр на выборе строки. Таким образом, Ваш сценарий может читать от stdin для работы непосредственно на данные строки (., %...). Что-то большее чем самые простые задачи, однако, и Вы были бы более обеспеченным помещением команд Python в собственный файл сценария.

1
ответ дан Martin Carpenter 7 November 2019 в 19:43
поделиться

, Если я хочу распечатать 'Привет' к строкам 4,5, 6 и 7, что не так:

, Если Вы хотите сделать что-то в случайным образом выбранных местах всюду по Вашему файлу, Вы лучше из записи нажатий клавиш и воспроизведения их. Перейдите к первой строке, которую Вы хотите изменить, и поразить qz к запуску записи в регистр z. Сделайте любые редактирования, которые Вы хотите для той строки и поражаете q снова, когда Вы закончены. Перейдите к следующей строке, которую Вы хотите измениться и нажать @z для воспроизведения макроса.

0
ответ дан too much php 7 November 2019 в 19:43
поделиться

Может кто-то разрабатывать эту точку: "Ваш сценарий может читать из stdin для работы непосредственно на данные строки (., %...)".

Одно общее использование должно отсортировать строки текста с помощью команды 'вида', доступной в оболочке. Например, можно отсортировать целый файл с помощью этой команды:

:%!sort

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

:!sort

Вы могли отсортировать строки использование 5-10 этой команды:

:5,10!sort

Вы могли записать свой собственный сценарий командной строки (предположение, что Вы знаете, как сделать это), который инвертирует строки текста. Это работает как это:

bash$ myreverse 'hello world!'
!dlrow olleh

Вы могли применить его к одному из Ваших открытых файлов в энергии точно таким же образом, Вы использовали sort:

:%!myreverse      <- all lines in your file are reversed
6
ответ дан too much php 7 November 2019 в 19:43
поделиться

Если бы Вы хотите сделать некоторые вызовы Python, не компилируя энергию с интерпретатором Python (который позволил бы Вам писать плагины в Python, и это также необходимо для Omnicomplete так или иначе), можно попробовать как это:

:.!python -c "import os; print os.getcwd()"

, Который сказал бы Вам, где Вы находитесь в диске (текущий путь).

Теперь позволяют нам число несколько строк, запускающихся из пустого файла, таким образом, мы видим результат легко:

:.!python -c "for i in range(1,101): print i"

(строки чисел энергии от 1 не 0) Теперь у нас есть просто количество каждой строки в каждой строке до строки 100.

Позволяют нам теперь поместить маленький сценарий в Ваш текущий путь (как показано выше) и выполнить его, видеть, как это работает. Давайте скопируем, вставляют этот глупый. В действительности Вы найдете самым полезным, чтобы сделать сценарий, которые производят одну строку на строку, но Вы не должны делать этого как этого сценария шоу:

print "hi"

try:
    while True:
        i=raw_input()
        print "this was:",i
except EOFError:
    print "bye"

, Таким образом, можно звонить, например (воображают, Вы назвали это "what.py"):

:10,20! python what.py

(Отмечают, что заполнение клавишей Tab работ имен файлов, таким образом, можно проверить, что это находится на самом деле в пути)

, Как Вы видите, everyline, питается к сценарию как стандартный вход. Сначала это производит "привет", в конце "до свидания" и промежуточный, для каждой строки, которую Вы производите, "это было": плюс строка. Таким образом, можно обработать линию за линией. Заметьте, что можно сделать более сложный материал, чем технологическая линия с методической точностью, можно на самом деле рассмотреть предыдущие строки. Для такого материала я импортировал бы sys и сделал бы это как это:

import sys

print "hello"

for i in sys.stdin.readlines():
    i = i.rstrip("\n") # you can also prevent print from doing \n instead
    print "here lyeth",i

print "see you"

Hope, которая помогает.

0
ответ дан nachik 7 November 2019 в 19:43
поделиться

От Вашего примера появляется, как будто Вы хотите выполниться, сценарий Python и иметь вывод сценария появляются в текущем буфере Vim. Если это корректно, то можно сделать следующее в командной строке в Vim:

%!python -c "for i in xrange(25): print 6*i"

-c опция к python дает ему сценарий для выполнения. Однако можно найти эту технику полезной только в очень простых делах, потому что в отличие от некоторых других языков, Python не предоставляет себя хорошо записи полных программ всех на одной строке.

5
ответ дан Greg Hewgill 7 November 2019 в 19:43
поделиться

Я думаю, что Вы действительно хотите, объяснен здесь .

0
ответ дан André 7 November 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: