Как работает ключевое слово await? - PullRequest
0 голосов
/ 04 января 2019

Для заданной ниже подпрограммы (f),

import csv
import urllib

def f(resp):
   print('Line 1')
   yield csv.reader(resp.read().decode('utf-8'))


def h():
    url = 'http://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NYSE&render=download'    
    resp = urllib.urlopen(url)
    cr = f(resp)

cr = f(resp) назначает объект итератора для cr,

cr.next() выполнить строку 1 и заблокировать ключевое слово yield.

Насколько я понимаю, с синтаксисом cr=f(resp) за сценой нет цикла событий (планировщика задач) с многопоточностью


Вместо cr=f(resp) (выше), если та же функция (h) имеет await f(resp), как указано ниже (ключевое слово await запрашивает синтаксис async),

async def h_async():
    url = 'http://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NYSE&render=download'    
    resp = urllib.urlopen(url)
    await f(resp)

тогда

Чем await f(resp) отличается от cr=f(resp)?

Чем h_async() отличается от h()? Вводит ли ключевое слово await цикл событий (планировщик задач) с многопоточностью за сценой, как показано в этом примере code

1 Ответ

0 голосов
/ 05 января 2019

await EXPR означает, что на этом этапе планировщик задач может включить что-то другое (например, извлечь что-то, что готово из очереди задач), а также указывает, что EXPR является ожидаемым. Если EXPR является сопрограммой, это означает, что у нее могут быть последующие await с, и снова что-то еще может быть выполнено, когда эта сопрограмма находится в неблокирующем состоянии ожидания (например, IO или ответ сети, сон и т. Д.)

...