anyone?
зелена нишка ∈ системна нишка ∈ процес
Още малко за multiprocessing
import urllib
from multiprocessing import Pool
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://github.com/',
'http://kefche.com/',
]
def fetch(url):
try:
return urllib.request.urlopen(url).status
except urllib.error.URLError as e:
return e.code
pool = Pool(4)
statuses = pool.map(fetch, urls)
pool.close()
pool.join()
fetch()
трябва да е дефинирана преди конструирането на pool
(спомнете си какво точно прави fork()
)
Да обхождаме дървета
class Node:
def __init__(self, value):
self.left = []
self.value = value
self.right = []
def iterate(self):
for node in self.left:
yield node.value
yield self.value
for node in self.right:
yield node.value
Къде сбъркахме?
..
def iterate(self):
for node in self.left:
yield from node.iterate()
yield self.value
for node in self.right:
yield from node.iterate()
Удобен модул за асинхронно изпълнение на неща
+-- Future
+-- Executor
+-- ThreadPoolExecutor
+-- ProcessPoolExecutor
Обект, който енкапсулира нещо за изпълнение в конкурентна среда.Държи състоянието му и ни дава удобен интерфейс за работа с него
Не използваме `Future`-ите директно, а ги създаваме през съответния `Executor`
Помните ли как ви казахме, че Python не може да решава такива проблеми?
PRIMES = [
112272535095293,
112582705942171,
112272535095293,
115280095190773,
115797848077099,
1099726899285419]
def is_prime(n):
# ...
def main():
with concurrent.futures.ProcessPoolExecutor() as executor:
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
print('{} is prime: {}'.format(number, prime))
Помните ли как ви казахме, че Python не може да решава такива проблеми?
Малки независими изпълними единици, които кооперативно си предават контрол над управлението.
В python 3.4 се появява модула asyncio
Важно е да си в event loop-а. Той отговаря за предаването на контрола между корутините
Искаме да реагираме на събитие по определен начин
Event loop-а проверява на определен(относително кратък) период от време дали се е случило събитиеи ни уевдомява, за да можем да реагираме
Когато използваме asyncio всяка нишка има по един event loop, отговарящ за задачите в нея
asyncio.get_event_loop
- връща текущия event loop обект за нишката, в която смеasyncio.set_event_loop
- позволява да променим event loop-а за текущата нишкаasyncio.set_event_loop_policy
- позволява да променим политиката на event loop-а за текущата нишка(не е просто)asyncio.get_event_loop_policy
asyncio.is_running
- проверява дали текущия loop "се върти"GO! GO! GO!
loop.run_until_complete(coroutine)
- пускаме събитийния цикъл и той ще спре когато подадената корутина приключи изпълнението сиloop.run_forever()
- пускаме събитийния цикъл "завинаги", т.е. докато изрично не го спремloop.stop()
- спираме съответния loopкойто ще наречем "прост"