Асинхронность и многопоточность в Яндекс.Такси —...

29

description

Интерактивный сервис должен управлять разнонаправленными потоками данных в реальном времени. При этом важно использовать ресурсы процессора максимально эффективно и минимизировать время доставки сообщения. Рассмотрим эти проблемы и способы их решения на примере разработки Яндекс.Такси.

Transcript of Асинхронность и многопоточность в Яндекс.Такси —...

Page 1: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

1

Page 2: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

2

Page 3: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

3

Page 4: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

4

Page 5: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

5

Page 6: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

6

Page 7: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

7

Page 8: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

8

Page 9: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

9

_drivers = {'dict': None, 'rtree': None}

@defer.inlineCallbacks

def update_drivers_positions():

try:

gzipped = yield fetch_all_tracks()

(dct, rtree) = yield defer.deferToThread(

extract_gzipped_tracks, gzipped)

_drivers['dict'] = dct

_drivers['rtree'] = rtree

finally:

callLater(UPDATE_INTERVAL, update_drivers_positions)

Page 10: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

10

Page 11: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

11

Page 12: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

12

import zlib

import base64

from twisted.internet import threads

def main():

strings = ['%010000000d' % i for i in range(1000)]

for string in strings:

d = threads.deferToThread(compress, string)

#d.addCallbacks(do_something_with_result)

def compress(string):

return base64.b64encode(zlib.compress(string, 9))

Page 13: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

13

Page 14: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

14

Page 15: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

15

Page 16: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

16

Page 17: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

17

Page 18: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

18

from router import build_route

@defer.inlineCallbacks

def find_suitable_drivers(src_point):

nearest = find_nearest_drivers(src_point, NEAREST_LIMIT)

estimates = yield defer.DeferredList(

[build_route(driver_point, src_point)

for (driver_point, _) in nearest])

suitable = []

for ((driver_point, driver), estimate) in zip(nearest, estimates):

(succeed, data) = estimate

if succeed:

(distance, time) = data

else:

(distance, time) = predict_route(driver_point, src_point)

suitable.append((time, distance, driver))

return sorted(suitable)

Page 19: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

19

Page 20: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

20

Page 21: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

21

@defer.inlineCallbacks

def request_suitable_drivers(order_id, src_point):

while (yield not is_order_expired(order_id)):

suitable = yield find_suitable_drivers(src_point)

for (park, request) in (yield build_requests(suitable)):

reactor.callLater(0, send_request, park, request)

del suitable

del request

yield sleep(REQUEST_INTERVAL)

Page 22: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

22

Page 23: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

23

Page 24: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

24

Page 25: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

25

Page 26: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

26

Page 27: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

27

Page 28: Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов

28