initial commit
						commit
						762804fb70
					
				@ -0,0 +1,70 @@
 | 
				
			|||||||
 | 
					# virtualenv
 | 
				
			||||||
 | 
					env
 | 
				
			||||||
 | 
					venv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pycharm
 | 
				
			||||||
 | 
					.idea
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ---> Python
 | 
				
			||||||
 | 
					# Byte-compiled / optimized / DLL files
 | 
				
			||||||
 | 
					__pycache__/
 | 
				
			||||||
 | 
					*.py[cod]
 | 
				
			||||||
 | 
					*$py.class
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# C extensions
 | 
				
			||||||
 | 
					*.so
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Distribution / packaging
 | 
				
			||||||
 | 
					.Python
 | 
				
			||||||
 | 
					env/
 | 
				
			||||||
 | 
					pypyenv/
 | 
				
			||||||
 | 
					build/
 | 
				
			||||||
 | 
					develop-eggs/
 | 
				
			||||||
 | 
					dist/
 | 
				
			||||||
 | 
					downloads/
 | 
				
			||||||
 | 
					eggs/
 | 
				
			||||||
 | 
					.eggs/
 | 
				
			||||||
 | 
					lib/
 | 
				
			||||||
 | 
					lib64/
 | 
				
			||||||
 | 
					parts/
 | 
				
			||||||
 | 
					sdist/
 | 
				
			||||||
 | 
					var/
 | 
				
			||||||
 | 
					*.egg-info/
 | 
				
			||||||
 | 
					.installed.cfg
 | 
				
			||||||
 | 
					*.egg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# PyInstaller
 | 
				
			||||||
 | 
					#  Usually these files are written by a python script from a template
 | 
				
			||||||
 | 
					#  before PyInstaller builds the exe, so as to inject date/other infos into it.
 | 
				
			||||||
 | 
					*.manifest
 | 
				
			||||||
 | 
					*.spec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Installer logs
 | 
				
			||||||
 | 
					pip-log.txt
 | 
				
			||||||
 | 
					pip-delete-this-directory.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Unit test / coverage reports
 | 
				
			||||||
 | 
					htmlcov/
 | 
				
			||||||
 | 
					.tox/
 | 
				
			||||||
 | 
					.coverage
 | 
				
			||||||
 | 
					.coverage.*
 | 
				
			||||||
 | 
					.cache
 | 
				
			||||||
 | 
					nosetests.xml
 | 
				
			||||||
 | 
					coverage.xml
 | 
				
			||||||
 | 
					*,cover
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Translations
 | 
				
			||||||
 | 
					*.mo
 | 
				
			||||||
 | 
					*.pot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Django stuff:
 | 
				
			||||||
 | 
					*.log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Sphinx documentation
 | 
				
			||||||
 | 
					docs/_build/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Redis
 | 
				
			||||||
 | 
					/dump.rdb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Project
 | 
				
			||||||
 | 
					config.py
 | 
				
			||||||
@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					import asyncio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def find_divisibles(inrange, div_by):
 | 
				
			||||||
 | 
					    """Really this is a bulk task"""
 | 
				
			||||||
 | 
					    print("finding nums in range {} divisible by {}".format(inrange, div_by))
 | 
				
			||||||
 | 
					    located = []
 | 
				
			||||||
 | 
					    for i in range(inrange):
 | 
				
			||||||
 | 
					        if i % div_by == 0:
 | 
				
			||||||
 | 
					            located.append(i)
 | 
				
			||||||
 | 
					        if i % 50000 == 0:
 | 
				
			||||||
 | 
					            await asyncio.sleep(0.001)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print("Done w/ nums in range {} divisble by {}".format(inrange, div_by))
 | 
				
			||||||
 | 
					    return located
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def main():
 | 
				
			||||||
 | 
					    divs1 = loop.create_task(find_divisibles(50800000, 34113))
 | 
				
			||||||
 | 
					    divs2 = loop.create_task(find_divisibles(100052, 3210))
 | 
				
			||||||
 | 
					    divs3 = loop.create_task(find_divisibles(500, 3))
 | 
				
			||||||
 | 
					    await asyncio.wait([divs1, divs2, divs3])
 | 
				
			||||||
 | 
					    return divs1, divs2, divs3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					        # returns a Task object, not the result objects themselves. You have to access the Task result
 | 
				
			||||||
 | 
					        # to see the output
 | 
				
			||||||
 | 
					        d1, d2, d3 = loop.run_until_complete(main())
 | 
				
			||||||
 | 
					        print(type(d1))
 | 
				
			||||||
 | 
					        print(d1.result())
 | 
				
			||||||
 | 
					    except Exception as e:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					    finally:
 | 
				
			||||||
 | 
					        loop.close()
 | 
				
			||||||
@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					import asyncio
 | 
				
			||||||
 | 
					import itertools
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def spin(msg):
 | 
				
			||||||
 | 
					    write, flush = sys.stdout.write, sys.stdout.flush
 | 
				
			||||||
 | 
					    for char in itertools.cycle('|/-\\'):
 | 
				
			||||||
 | 
					        status = f"{char} {msg}"
 | 
				
			||||||
 | 
					        write(status)
 | 
				
			||||||
 | 
					        flush()
 | 
				
			||||||
 | 
					        write('\x08' * len(status))  # backspace out the line
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            await asyncio.sleep(.1)
 | 
				
			||||||
 | 
					        except asyncio.CancelledError:
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					    write(' ' * len(status) + '\x08' * len(status))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def slow_function():
 | 
				
			||||||
 | 
					    await asyncio.sleep(3)
 | 
				
			||||||
 | 
					    return 42
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def supervisor():
 | 
				
			||||||
 | 
					    spinner = loop.create_task(spin('Thinking!'))
 | 
				
			||||||
 | 
					    print('Spinner Object:', spinner)
 | 
				
			||||||
 | 
					    result = await slow_function()
 | 
				
			||||||
 | 
					    spinner.cancel()
 | 
				
			||||||
 | 
					    return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					        # returns a Task object, not the result objects themselves. You have to access the Task result
 | 
				
			||||||
 | 
					        # to see the output
 | 
				
			||||||
 | 
					        result = loop.run_until_complete(supervisor())
 | 
				
			||||||
 | 
					    except Exception as e:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					    finally:
 | 
				
			||||||
 | 
					        loop.close()
 | 
				
			||||||
@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					"""
 | 
				
			||||||
 | 
					Here is a trivial example of us awaiting the result of another coroutine. We did this by using the await
 | 
				
			||||||
 | 
					keyword before calling it. The await keyword gives control back to the event loop and registers add_42(23) function
 | 
				
			||||||
 | 
					and arguments call to the Task Queue allowing the event loop to schedule other tasks. In this case this
 | 
				
			||||||
 | 
					single function is the only Task on the Queue so it will be picked up and executed. Once executed the result is
 | 
				
			||||||
 | 
					returned to hello_async allowing it to be resumed by the event loop scheduler.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import asyncio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def add_42(number):
 | 
				
			||||||
 | 
					    if not isinstance(number, int):
 | 
				
			||||||
 | 
					        raise ValueError("You need to supply a number to this bitch")
 | 
				
			||||||
 | 
					    print("Adding 42")
 | 
				
			||||||
 | 
					    return 42 + number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def hello_async():
 | 
				
			||||||
 | 
					    print("Hello async!")
 | 
				
			||||||
 | 
					    co_result = await add_42(23)
 | 
				
			||||||
 | 
					    return co_result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					event_loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
					    print("Entering event loop")
 | 
				
			||||||
 | 
					    result = event_loop.run_until_complete(hello_async())
 | 
				
			||||||
 | 
					    print(result)
 | 
				
			||||||
 | 
					finally:
 | 
				
			||||||
 | 
					    event_loop.close()
 | 
				
			||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					"""
 | 
				
			||||||
 | 
					Once asyncio has created an event loop,an application registers the functions to call back when a specific event happens:
 | 
				
			||||||
 | 
					 as time passes, a file descriptor is ready to be read,or a socket is ready to be written. That type of function is
 | 
				
			||||||
 | 
					 called a coroutine. It is a particular type of function that can give back control to the caller so that the event loop
 | 
				
			||||||
 | 
					  can continue running.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					import asyncio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Adding the async keyword makes this a coroutine object
 | 
				
			||||||
 | 
					async def hello_world():
 | 
				
			||||||
 | 
					    print('Hello world')
 | 
				
			||||||
 | 
					    return 42
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hello_world_coroutine = hello_world()
 | 
				
			||||||
 | 
					print(hello_world_coroutine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					event_loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
					    print('Entering the event loop')
 | 
				
			||||||
 | 
					    result = event_loop.run_until_complete(hello_world_coroutine)
 | 
				
			||||||
 | 
					    print(result)
 | 
				
			||||||
 | 
					finally:
 | 
				
			||||||
 | 
					    event_loop.close()
 | 
				
			||||||
@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import asyncio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def hello_async():
 | 
				
			||||||
 | 
					    print('Hello Async!')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def hello_python():
 | 
				
			||||||
 | 
					    print('Hello Python')
 | 
				
			||||||
 | 
					    await asyncio.sleep(0.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					event_loop = asyncio.get_event_loop()
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
					    result = event_loop.run_until_complete(asyncio.gather(
 | 
				
			||||||
 | 
					        hello_async(),
 | 
				
			||||||
 | 
					        hello_python(),
 | 
				
			||||||
 | 
					        hello_python(),
 | 
				
			||||||
 | 
					    ))
 | 
				
			||||||
 | 
					    print(result)
 | 
				
			||||||
 | 
					finally:
 | 
				
			||||||
 | 
					    event_loop.close()
 | 
				
			||||||
@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					"""
 | 
				
			||||||
 | 
					Here we have turned was was a synchronous call into an async call  with the use of the select module.
 | 
				
			||||||
 | 
					select is old however and OSs have newer system calls. Asyncio abstracts the system calls out, and
 | 
				
			||||||
 | 
					gives us primitives to build better async code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import select
 | 
				
			||||||
 | 
					import socket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					s = socket.create_connection(("httpbin.org", 80))
 | 
				
			||||||
 | 
					s.send(b"GET /delay/5 HTTP/1.1\r\nHost: httpbin.org\r\n\r\n")
 | 
				
			||||||
 | 
					s.setblocking(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while True:
 | 
				
			||||||
 | 
					    ready_to_read, ready_to_write, in_error = select.select([s], [], [])
 | 
				
			||||||
 | 
					    if s in ready_to_read:
 | 
				
			||||||
 | 
					        buf = s.recv(1024)
 | 
				
			||||||
 | 
					        print(buf)
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue