Add multitasking

This commit is contained in:
Alexander Nozik 2024-11-12 09:20:43 +03:00
parent 10d6d1e6c2
commit edb92aa1a1
4 changed files with 1983 additions and 1234 deletions

View File

@ -18,8 +18,8 @@
16. Стоит ли использовать scope функции везде, где это возможно.
17. Чем отличается arrayListOf()` от `mutableListOf()`?
18. List в Kotlin всегда реализует List в Java при интеропе?
19. Можно ли сделать собствен карту get и set при помощи квадратных скобок?
20. В чем отличие forEach в стандартной библиотеке Котлин и Java?
19. Можно ли сделать собственную реализацию карты с get и set при помощи квадратных скобок?
20. В чем отличие forEach на карте в стандартной библиотеке Котлин и Java?
21. Как работают функции componentN?
22. Почему в Котлин нет диапазонов для чисел с плавающей точкой?
23. Какой оператор должен быть реализован типе для того, чтобы он стал делегатом?

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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
}