diff --git a/content/blog/gevent.md b/content/blog/gevent.md new file mode 100644 index 0000000..80257b7 --- /dev/null +++ b/content/blog/gevent.md @@ -0,0 +1,33 @@ +--- +title: "Gevent" +date: 2020-04-09T17:22:52-04:00 +draft: false +tags: ["python", "concurrency"] +--- + +In my last post I spoke about [concurrency with asyncio](https://brandonrozek.com/blog/pyasyncio/). Now what if you don't want to concern yourself with async/await practices and just want to write synchronous code that executes I/O asynchronously? That's where the library [gevent](http://www.gevent.org/) comes in. It does this by modifying Python's standard library during runtime to call it's own asynchronous versions. + +Last post code's example written in `gevent`. + +```python +# The first two lines must be called before +# any other modules are loaded +import gevent +from gevent import monkey; monkey.patch_all() + +import time + +def think(duration): + print("Starting to think for " + str(duration) + " seconds...") + time.sleep(duration) + print("Finished thinking for " + str(duration) + " seconds...") + +gevent.wait([ + gevent.spawn(think, 5), + gevent.spawn(think, 2) +]) +``` + +Notice that the function `think` is written the same as the synchronous version. + +`gevent` is written on top of C libraries `libev` or `libuv` . This combined with the monkey patching can make `gevent` based applications hard to debug if something goes wrong. Otherwise it's a great tool to quickly take advantage of concurrency. \ No newline at end of file