Add multitasking
This commit is contained in:
parent
10d6d1e6c2
commit
edb92aa1a1
@ -18,8 +18,8 @@
|
|||||||
16. Стоит ли использовать scope функции везде, где это возможно.
|
16. Стоит ли использовать scope функции везде, где это возможно.
|
||||||
17. Чем отличается arrayListOf()` от `mutableListOf()`?
|
17. Чем отличается arrayListOf()` от `mutableListOf()`?
|
||||||
18. List в Kotlin всегда реализует List в Java при интеропе?
|
18. List в Kotlin всегда реализует List в Java при интеропе?
|
||||||
19. Можно ли сделать собствен карту get и set при помощи квадратных скобок?
|
19. Можно ли сделать собственную реализацию карты с get и set при помощи квадратных скобок?
|
||||||
20. В чем отличие forEach в стандартной библиотеке Котлин и Java?
|
20. В чем отличие forEach на карте в стандартной библиотеке Котлин и Java?
|
||||||
21. Как работают функции componentN?
|
21. Как работают функции componentN?
|
||||||
22. Почему в Котлин нет диапазонов для чисел с плавающей точкой?
|
22. Почему в Котлин нет диапазонов для чисел с плавающей точкой?
|
||||||
23. Какой оператор должен быть реализован типе для того, чтобы он стал делегатом?
|
23. Какой оператор должен быть реализован типе для того, чтобы он стал делегатом?
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
791
notebooks/Multitasking.ipynb
Normal file
791
notebooks/Multitasking.ipynb
Normal file
@ -0,0 +1,791 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"%use coroutines"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "Al3t64xqN0DN3JmLKHOVn2",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {},
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "# Три оси многозадачности"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Синхронный х однопоточный х неконкурентный ",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "TawmM9V8by8RGHfhNv7D3m",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"repeat(10){\n",
|
||||||
|
" println(\"Line number $it\")\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "XzjwoelmODMg8pmaJRe1KK",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import java.util.stream.*\n",
|
||||||
|
"\n",
|
||||||
|
"IntStream.range(0, 100).sum()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "UuTmCNAMCpUAHaAwWVYJPy",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Синхронный х однопоточный х конкурентный",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "f6DGHwBOIRvKuYjtxVRn0W",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"val list = (0..100).toMutableList()\n",
|
||||||
|
"\n",
|
||||||
|
"list.forEach{\n",
|
||||||
|
" if(it % 2 == 0) list.remove(it)\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "O1DPfMSAedOChaqU5JWXrU",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "N3QIwvANEngnvMgsCVJatN",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Синхронный х многопоточный х неконкурентный",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "x9nGAXOgOlWxd4cu6Smio8",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"val sum = IntStream.range(0, 100).parallel().sum()\n",
|
||||||
|
"\n",
|
||||||
|
"println(sum)"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "lRJGB0cHhpjQTdRdGynG0G",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "1lLEGWWbB6qnFr1qjfSGpo",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Асинхронный х однопоточный х неконкурентный",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "OTRLxfWLADkMoc9ViJfeEq",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"fun runLongTask(result: Int = 8): Int {\n",
|
||||||
|
" Thread.sleep(100)\n",
|
||||||
|
" println(\"Task complete: $result\")\n",
|
||||||
|
" return result\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "r1yVVtgMhexxzx7gGVmeIg",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import java.util.concurrent.*\n",
|
||||||
|
"\n",
|
||||||
|
"val executor = Executors.newSingleThreadExecutor()\n",
|
||||||
|
"\n",
|
||||||
|
"val future = executor.submit<Int> {\n",
|
||||||
|
" val result = runLongTask()\n",
|
||||||
|
" println(result)\n",
|
||||||
|
" result\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"future.get()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "8YvIKfD1I7cfbiPRMpk0DC",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Асинхронный х однопоточный х конкурентный ",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "nyjKPayaltq8gBzq2bIP1c",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"interface Observable{\n",
|
||||||
|
" fun onChange(callback: (Int) -> Unit)\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"val observable: Observable by lazy{ TODO() }"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "UreOIHJpXQYfkjeHOvf1Bq",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"val list: MutableList<Int> = mutableListOf<Int>()\n",
|
||||||
|
"\n",
|
||||||
|
"observable.onChange { \n",
|
||||||
|
" list.add(it)\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "1in8iE7mL9m895XWUNh0Sl",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Асинхронный х многопоточный х неконкурентный",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "TczpOZrkCKogcT7x7XWAUT",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "YvgL8fFuneP9USjjnsfiQj",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"val executor: ExecutorService = Executors.newFixedThreadPool(4)\n",
|
||||||
|
"\n",
|
||||||
|
"repeat(8){\n",
|
||||||
|
" executor.submit{\n",
|
||||||
|
" runLongTask(it)\n",
|
||||||
|
" }\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "9NS1h5b5lJ0BEzieUt6xrr",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Синхронный х многопоточный х конкурентный",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "REBgToVc8iKIrODCWXPdZj",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import kotlin.io.path.Path\n",
|
||||||
|
"import kotlin.io.path.writeText\n",
|
||||||
|
"\n",
|
||||||
|
"val file = Path(\"someFile.txt\")\n",
|
||||||
|
"\n",
|
||||||
|
"val data: List<String> = emptyList()\n",
|
||||||
|
"\n",
|
||||||
|
"data.stream()\n",
|
||||||
|
" .parallel()\n",
|
||||||
|
" .forEach { \n",
|
||||||
|
" file.writeText(it)\n",
|
||||||
|
" }"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "3AjItM8WtjFE9qJo9JvZFW",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "### Асинхронный х многопоточный х конкурентный",
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "XDCp5EjIq8v6ABeo5q2K6S",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"val cache = mutableMapOf<Int, Int>\n",
|
||||||
|
"\n",
|
||||||
|
"val consumer: (Int) -> Unit = TODO()\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"repeat(8){ i->\n",
|
||||||
|
" executor.submit{\n",
|
||||||
|
" val result = cache.getOrPut(i){\n",
|
||||||
|
" runLongTask(i)\n",
|
||||||
|
" }\n",
|
||||||
|
" consumer(result)\n",
|
||||||
|
" }\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "taOKUd5Gc9U6TuGVFZJvew",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"## Инструменты"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "bSK4aInljsXYinbOTNSLdc",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"#### Thread"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "qjWpglMy3eSM475ozgnDPA",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import kotlin.concurrent.*\n",
|
||||||
|
"\n",
|
||||||
|
"val t = thread {\n",
|
||||||
|
" runLongTask()\n",
|
||||||
|
"}\n",
|
||||||
|
"t.join()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "nEZ6jKJhVHhsjMvptTQ3rU",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "k35GcE4VUIMtrznZ0C3BmC",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"#### Future"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "bX0GaqyAH6q7Max0Tky7DW",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"val future = executor.submit<Int>{\n",
|
||||||
|
" runLongTask()\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"future.get()\n",
|
||||||
|
"future.cancel(true)"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "TVhCm0JtWiYFFqWYORxuya",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"#### CompletableFuture"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "a5BY9U8m9OeZSSsS0yGRSZ",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import java.util.concurrent.*\n",
|
||||||
|
"\n",
|
||||||
|
"val cf = CompletableFuture.supplyAsync{\n",
|
||||||
|
" runLongTask()\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"val cf2 = cf.whenComplete{ res, _ ->\n",
|
||||||
|
" runLongTask(res - 1)\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"val cf3 = cf.whenComplete{ res, _ ->\n",
|
||||||
|
" runLongTask(res + 1)\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"cf2.join()\n",
|
||||||
|
"cf3.join()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "2rchFZt5trGqzOCuU3aPvz",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"#### Lock"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "izHWuE5ZZo1hphjMmc7BHj",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import java.util.concurrent.locks.*\n",
|
||||||
|
"\n",
|
||||||
|
"val list = mutableListOf<Int>()\n",
|
||||||
|
"val lock = ReentrantLock()\n",
|
||||||
|
"\n",
|
||||||
|
"val cf4 = CompletableFuture.supplyAsync{\n",
|
||||||
|
" val res = runLongTask(4)\n",
|
||||||
|
" lock.withLock { \n",
|
||||||
|
" list.add(res)\n",
|
||||||
|
" }\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"val cf5 = CompletableFuture.supplyAsync{\n",
|
||||||
|
" val res = runLongTask(5)\n",
|
||||||
|
" lock.withLock { \n",
|
||||||
|
" list.add(res)\n",
|
||||||
|
" }\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"cf4.join()\n",
|
||||||
|
"cf5.join()\n",
|
||||||
|
"\n",
|
||||||
|
"list"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "JTXxcGnvTS36OVX6GkJfkK",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {},
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "Reactive streams"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"class A(val value: Int)\n",
|
||||||
|
"class B(val value: Int)\n",
|
||||||
|
"\n",
|
||||||
|
"val aFlow = flowOf<A>()\n",
|
||||||
|
"val bFlow = flowOf<B>()\n",
|
||||||
|
"\n",
|
||||||
|
"val combined = aFlow.zip(bFlow){ a, b->\n",
|
||||||
|
" a.value + b.value\n",
|
||||||
|
"}.debounce(2.seconds)"
|
||||||
|
],
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {},
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": "Actor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"sealed class Event {\n",
|
||||||
|
" class Open(val transactionId: Int): Event()\n",
|
||||||
|
" class Close(val tranactionId: Int): Event()\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"fun interface Actor {\n",
|
||||||
|
" suspend fun receive(event: Event)\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"val actor = object : Actor {\n",
|
||||||
|
" private var transaction: Int? = null\n",
|
||||||
|
" override suspend fun receive(event: Event) {\n",
|
||||||
|
" when (event) {\n",
|
||||||
|
" is Event.Open -> if (transaction != null) {\n",
|
||||||
|
" error(\"Transaction already open\")\n",
|
||||||
|
" } else {\n",
|
||||||
|
" transaction = event.transactionId\n",
|
||||||
|
" }\n",
|
||||||
|
" is Event.Close ->if (transaction != event.tranactionId) {\n",
|
||||||
|
" error(\"Wrong transaction id: ${event.tranactionId}\")\n",
|
||||||
|
" } else {\n",
|
||||||
|
" transaction = null\n",
|
||||||
|
" }\n",
|
||||||
|
" }\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
"}"
|
||||||
|
],
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"## Сорта асинхронности"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "YDqoXAD2XEED9MSPRuMMzL",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"#### Callback"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "kb1ccsTMIZX3aacLF6gPrJ",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"import java.net.*\n",
|
||||||
|
"import java.net.http.*\n",
|
||||||
|
"import java.net.http.HttpResponse.*\n",
|
||||||
|
"\n",
|
||||||
|
"val client: HttpClient = HttpClient.newHttpClient()\n",
|
||||||
|
"\n",
|
||||||
|
"val request : HttpRequest = HttpRequest.newBuilder()\n",
|
||||||
|
" .uri(URI.create(\"https://sciprog.center\"))\n",
|
||||||
|
" .GET().build()\n",
|
||||||
|
"\n",
|
||||||
|
"val regex = \"\"\"href=\\\"(.+\\.png)\\\"\"\"\".toRegex()\n",
|
||||||
|
"\n",
|
||||||
|
"client.sendAsync(request, BodyHandlers.ofString())\n",
|
||||||
|
" .thenApply{ it.body() }\n",
|
||||||
|
" .thenApply{ \n",
|
||||||
|
" val resources = regex.findAll(it).map{it.groupValues[1]}\n",
|
||||||
|
"\n",
|
||||||
|
" resources.forEach { resourceName->\n",
|
||||||
|
" val resourceRequest : HttpRequest = HttpRequest.newBuilder()\n",
|
||||||
|
" .uri(URI.create(\"https://sciprog.center$resourceName\"))\n",
|
||||||
|
" .GET().build()\n",
|
||||||
|
" client.sendAsync(resourceRequest, BodyHandlers.ofByteArray()).thenAccept{ resourceResponse ->\n",
|
||||||
|
" val bodyBytes = resourceResponse.body()\n",
|
||||||
|
" //do something with the body\n",
|
||||||
|
" }\n",
|
||||||
|
" }\n",
|
||||||
|
" resources\n",
|
||||||
|
" }\n",
|
||||||
|
" .thenAccept{ println(it.toList()) }\n",
|
||||||
|
" .join()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "jZrkouEiPJnMCCpxTFlgVP",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"source": [
|
||||||
|
"#### Реактивные потоки"
|
||||||
|
],
|
||||||
|
"attachments": {},
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "7zwURNaHnaTgOTAZumDDcd",
|
||||||
|
"type": "MD",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [],
|
||||||
|
"metadata": {
|
||||||
|
"datalore": {
|
||||||
|
"node_id": "lPXl5Gkvu7CuhlhUV7YJab",
|
||||||
|
"type": "CODE",
|
||||||
|
"hide_input_from_viewers": true,
|
||||||
|
"hide_output_from_viewers": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Kotlin",
|
||||||
|
"language": "kotlin",
|
||||||
|
"name": "kotlin"
|
||||||
|
},
|
||||||
|
"datalore": {
|
||||||
|
"computation_mode": "JUPYTER",
|
||||||
|
"package_manager": "pip",
|
||||||
|
"base_environment": "default",
|
||||||
|
"packages": [],
|
||||||
|
"report_row_ids": [],
|
||||||
|
"version": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 4
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user