Aku membuat module syncio yang terinspirasi dari asyncio.
dengan module ini kita bisa dengan mudah membuat concurrent task pada lingkungan synchronous. 
berikut contohnya:
from syncio import create_task, gather
def hello(n: int) -> str:
    return f"hello {n + 1}"
tasks = [create_task(hello)(i) for i in range(3)]
results = gather(*tasks)
print("output task_1:", results["task_1"])
print("output task_2:", results["task_2"])
print("output task_3:", results["task_3"])
# atau menggunakan iterator
for result in results:
    print(result)
Create task
create_task digunakan untuk membuat task baru dan create_task dapat dijalankan dengan create_task(callable, args=(), kwargs={}) atau create_task(callable)(*args, **kwargs).
Gather
Gather adalah metode untuk menjalankan tasks secara bersamaan dan mengumpulkan outputnya. ada 2 pilihan gather:
- 
    syncio.gather(*tasks): gather ini memanfaatkan modulemultiprocessing.
- 
    syncio.thread_gather(*tasks): gather ini memanfaatkan modulethreading.
pilihlah gather yang pas sesuai kebutuhan.
TaskOutput
TaskOutput mengumpulkan semua output dari task gather dalam format dictionary dengan task_id yang berdasarkan lokasi arg pada gather() atau thread_gather().
TaskOutput juga bisa di iterasi dengan for-loop seperti pada contoh, untuk langsung mendapatkan output.
TaskReturnException
jika ada task yang raise exception maka outputnya adalah instance dari TaskReturnException.
object ini memiliki atribut exception yang menyimpan BaseException e dan print_exception() yang fungsinya untuk menampilkan traceback.
untuk fleksibilitas if condition object ini bersifat bool(False) dan len(0).
Type Safety
syncio sudah menerapakan type safety yang ketat (strict) tapi hanya aktif jika menggunakan type checking seperti mypy (sangat direkomendasikan).