Многопоточность и асинхронное программирование на Python: ключевые технологии повышения эффективности и производительности программ
Многопоточность и асинхронное программирование на Python: ключевые технологии повышения эффективности и производительности программ

1. Основные понятия многопоточности

Прежде чем мы начнем, давайте разберемся с некоторыми основными концепциями многопоточного программирования:

  • Нить:Это наименьшая единица, с помощью которой операционная система может выполнять планирование вычислений.,Обычно внутри процесса.
  • Многопоточность:Относится к одновременному запуску нескольких потоков в одной программе.。
  • GIL(Global Interpreter Lock):PythonГлобальная блокировка переводчика,Ограничьте, чтобы только один поток мог одновременно выполнять байт-код Python.,Таким образом, в задачах с интенсивным использованием процессора,Многопоточность не в полной мере использует преимущества многоядерных процессоров.

В программировании на Python,Многопоточность — широко используемый метод параллельного программирования.,Это может эффективно повысить эффективность выполнения программы.,особенно когда имеешь дело сI/OВо время интенсивных задач。Pythonпредоставилthreadingмодуль,Делает многопоточное программирование относительно простым.。В этой статье будет подробно рассмотреноthreadingБазовые знания модулей.,И продемонстрируем применение многопоточности на примерах.

2. Основы модуля потоковой обработки

threadingмодульпредоставилсоздаватьиуправлятьнитьизинструмент。Ниже приведены некоторые часто используемыеthreadingмодульсерединаиздобрыйифункция:

  • Threadдобрый:用于создаватьнитьиздобрый,по наследствуThreadдобрыйивыполнитьrunМетод для определения логики выполнения потока。
  • start()метод:Начать тему。
  • join()метод:Дождитесь завершения выполнения потока。
  • active_count()функция:Получить количество активных в данный момент потоков。

3. Практика написания кода: многопоточная загрузка изображений

Ниже приведен пример, демонстрирующий применение многопоточности. Мы будем использовать многопоточность для загрузки серии изображений.

Язык кода:python
кодКоличество запусков:0
копировать
import threading
import requests
from queue import Queue

class ImageDownloader:
    def __init__(self, urls):
        self.urls = urls
        self.queue = Queue()

    def download_image(self, url):
        response = requests.get(url)
        if response.status_code == 200:
            filename = url.split("/")[-1]
            with open(filename, "wb") as f:
                f.write(response.content)
            print(f"Downloaded: {filename}")

    def worker(self):
        while True:
            url = self.queue.get()
            if url is None:
                break
            self.download_image(url)
            self.queue.task_done()

    def start_threads(self, num_threads=5):
        threads = []
        for _ in range(num_threads):
            thread = threading.Thread(target=self.worker)
            thread.start()
            threads.append(thread)

        for url in self.urls:
            self.queue.put(url)

        self.queue.join()

        for _ in range(num_threads):
            self.queue.put(None)

        for thread in threads:
            thread.join()

if __name__ == "__main__":
    image_urls = ["url1", "url2", "url3", ...]  # Замените URL фактического изображения.
    downloader = ImageDownloader(image_urls)
    downloader.start_threads()

В этом примере,Мы создалиImageDownloaderдобрый,который содержитworkerметод,Используется для загрузки изображений. через многопоточность,Мы можем загружать несколько изображений параллельно.,Повысьте эффективность загрузки.

4. Анализ кода

  • download_imageметод:Отвечает за конкретную реализацию загрузки изображений.。
  • workerметод:Логика выполнения в виде потока,Постоянно получать URL-адреса изображений для загрузки из своей очереди.,и позвониdownload_imageметод。
  • start_threadsметод:Запустить указанное количество потоков,Поместите URL-адрес изображения в очередь,Подождите, пока все потоки завершат выполнение.

6. Предохранитель нити и механизм блокировки.

В многопоточном программировании могут возникать состояния гонки из-за одновременного доступа нескольких потоков к общим ресурсам. Чтобы избежать этой ситуации, можно использовать механизм блокировки, гарантирующий, что только один поток может получить доступ к общему ресурсу одновременно.

threadingмодульсерединапредоставилLockдобрый,С помощью которого можно создать замок,использоватьacquireметод Получить блокировку,использоватьreleaseметодразблокировать замок。Вот простой пример:

Язык кода:python
кодКоличество запусков:0
копировать
import threading

counter = 0
counter_lock = threading.Lock()

def increment_counter():
    global counter
    for _ in range(1000000):
        with counter_lock:
            counter += 1

def main():
    thread1 = threading.Thread(target=increment_counter)
    thread2 = threading.Thread(target=increment_counter)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

    print("Counter:", counter)

if __name__ == "__main__":
    main()

В этом примере,Мы создалиглобальные переменныеcounter,ииспользоватьзаблокировать безопасныйсуществоватьдванить Изменить одновременноcounterУсловия гонки не возникнут, когда。

7. Применимые сценарии многопоточности

Многопоточность подходит для обработки задач с интенсивным вводом-выводом, таких как сетевые запросы, чтение и запись файлов и т. д. В этих сценариях потоки могут отказаться от использования ЦП во время ожидания ввода-вывода, давая другим потокам возможность выполниться и повышая общую эффективность программы.

Однако при обработке задач с интенсивным использованием ЦП многопоточность не может полностью использовать многоядерные процессоры из-за GIL Python, что может привести к узким местам в производительности. Для задач с интенсивным использованием ЦП рассмотрите возможность использования многопроцессного программирования или других моделей параллелизма.

9. Обработка исключений и многопоточность

В многопоточном программировании обработка исключений может стать более сложной. Поскольку каждый поток имеет свой собственный контекст выполнения, исключение может быть вызвано в одном потоке, но перехвачено в другом. Для эффективной обработки исключений нам необходимо использовать соответствующие механизмы обработки исключений в каждом потоке.

Язык кода:python
кодКоличество запусков:0
копировать
import threading

def thread_function():
    try:
        # Некоторые операции, которые могут вызывать исключения
        result = 10 / 0
    except ZeroDivisionError as e:
        print(f"Exception in thread: {e}")

if __name__ == "__main__":
    thread = threading.Thread(target=thread_function)
    thread.start()
    thread.join()

    print("Main thread continues...")

существовать В этом примере,нитьthread_functionОперации дивизии могут привести кZeroDivisionErrorаномальный。为Понятно捕获и处理这个аномальный,нассуществоватьнитьизкодкусоксерединаиспользовать Понятноtry-exceptзаявление。

10. Меры предосторожности при многопоточности

При многопоточном программировании есть некоторые распространенные задачи, требующие особого внимания:

  • потокобезопасность:Обеспечьте нескольконить Одновременный доступ к общим ресурсам не приводит к гонкам за данными.инепоследовательность。
  • тупик:когда нескольконитьвзаимныйждать待对方разблокировать замок时可能发生тупик,Замки необходимо проектировать и использовать осторожно.
  • Ограничения GIL:Pythonиз Глобальная блокировка переводчика может быть более ограничительнойнитьсуществоватьCPUУлучшение производительности в интенсивных задачах。
  • Обработка исключений:нуждатьсясуществоватькаждыйнитьсередина Правильное обращениеаномальный,Чтобы исключения не возникали в одном потоке, но не перехватывались в других потоках.

11. Оптимизация многопоточной производительности

В некоторых случаях мы можем оптимизировать производительность многопоточных программ с помощью некоторых методов:

  • пул потоков:использоватьconcurrent.futuresмодульсерединаизThreadPoolExecutorсоздатьпул потоки, улучшить возможность повторного использования потоков.
  • очередь:использоватьочередькоординировать нескольконитьмеждуиз Работа,Внедрить модель производитель-потребитель.
  • избегать Ограничения GIL:дляCPUИнтенсивные задачи,учитыватьиспользоватьмногопроцессный、asyncioПодождите других моделей параллелизма。

13. Объектно-ориентированный многопоточный дизайн

В практических приложениях мы обычно сталкиваемся с более сложными проблемами, требующими сочетания многопоточности и объектно-ориентированного проектирования. Ниже приведен простой пример, демонстрирующий, как использовать объектно-ориентированный подход для разработки многопоточной программы:

Язык кода:python
кодКоличество запусков:0
копировать
import threading
import time

class WorkerThread(threading.Thread):
    def __init__(self, name, delay):
        super().__init__()
        self.name = name
        self.delay = delay

    def run(self):
        print(f"{self.name} started.")
        time.sleep(self.delay)
        print(f"{self.name} completed.")

if __name__ == "__main__":
    thread1 = WorkerThread("Thread 1", 2)
    thread2 = WorkerThread("Thread 2", 1)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

    print("Main thread continues...")

существовать В этом примере,Мы создалиWorkerThreadдобрый,Унаследовано отThreadдобрый,и переписанrunметод,Определяет логику выполнения потока. Каждому потоку присваивается имя и время задержки.

14. Многопоточность и диспетчер ресурсов

Рассмотрим сценарий, в котором нам нужно создать менеджер ресурсов, отвечающий за управление выделением и выпуском определенного ресурса. В настоящее время мы можем использовать многопоточность для достижения асинхронного управления ресурсами. Вот пример простого менеджера ресурсов:

Язык кода:python
кодКоличество запусков:0
копировать
import threading
import time

class ResourceManager:
    def __init__(self, total_resources):
        self.total_resources = total_resources
        self.available_resources = total_resources
        self.lock = threading.Lock()

    def allocate(self, request):
        with self.lock:
            if self.available_resources >= request:
                print(f"Allocated {request} resources.")
                self.available_resources -= request
            else:
                print("Insufficient resources.")

    def release(self, release):
        with self.lock:
            self.available_resources += release
            print(f"Released {release} resources.")

class UserThread(threading.Thread):
    def __init__(self, name, resource_manager, request, release):
        super().__init__()
        self.name = name
        self.resource_manager = resource_manager
        self.request = request
        self.release = release

    def run(self):
        print(f"{self.name} started.")
        self.resource_manager.allocate(self.request)
        time.sleep(1)  # Simulate some work with allocated resources
        self.resource_manager.release(self.release)
        print(f"{self.name} completed.")

if __name__ == "__main__":
    manager = ResourceManager(total_resources=5)

    user1 = UserThread("User 1", manager, request=3, release=2)
    user2 = UserThread("User 2", manager, request=2, release=1)

    user1.start()
    user2.start()

    user1.join()
    user2.join()

    print("Main thread continues...")

существовать В этом примере,ResourceManagerдобрый负责управлятьресурсизраспространятьивыпускать,иUserThreadдобрыйпредставляет собойиспользоватьресурсизпользовательнить。проходитьиспользовать Замок,Обеспечьте безопасное распределение и высвобождение ресурсов.

16. Многопоточная отладка и анализ производительности

При выполнении многопоточного программирования,Отладка и анализ производительности — важные аспекты, которые нельзя игнорировать. Python предоставляет некоторые инструменты и методы,Помогите нам лучше понять и Отладку многопоточных программ.

Отладка многопоточных программ
  1. использоватьprintзаявление:существоватьсоответствующийизвставка позицииprintзаявление Вывод ключевой информации,Помогает отслеживать ход выполнения программы.
  2. Модуль журнала:использоватьPythonизloggingмодуль Запись времени выполнения программыизинформация,Включая начало, завершение потока и ключевые операции.
  3. PDB-отладчик:Вставить точку останова в код,использоватьPythonиз Встроенный отладчикpdbВыполнение интерактивной отладки。
Язык кода:python
кодКоличество запусков:0
копировать
import pdb

# Вставить точку останова в код
pdb.set_trace()
Анализ производительности многопоточных программ
  1. использоватьtimeitмодуль:проходитьсуществоватькодвстроенный таймеркод,использоватьtimeitмодульдля измерения конкретных операций илифункцияиз Время выполнения。
Язык кода:python
кодКоличество запусков:0
копировать
import timeit

def my_function():
    # код для проверки

# Время выполнения тестовой функции
execution_time = timeit.timeit(my_function, number=1)
print(f"Execution time: {execution_time} seconds")
  1. использоватьcProfileмодульcProfileдаPythonиз性能分析инструмент,Может помочь просмотреть вызовы функций и время выполнения.
Язык кода:python
кодКоличество запусков:0
копировать
import cProfile

def my_function():
    # код для проверки

# Запустите анализ производительности
cProfile.run("my_function()")
  1. Используйте сторонние инструменты:некоторые сторонние инструменты,нравитьсяline_profilermemory_profilerждать,Может предоставить более подробную информацию для анализа производительности.,Помогите выявить узкие места в производительности.
Язык кода:bash
копировать
# Установите line_profiler
pip install line_profiler

# Анализ производительности с использованием line_profiler
kernprof -l script.py
python -m line_profiler script.py.lprof

17. Безопасность и риски многопоточности

Хотя многопоточное программирование может улучшить производительность программы, оно также создает некоторые потенциальные проблемы с безопасностью. Вот некоторые области, на которые следует обратить внимание:

  1. потокобезопасность:确保共享ресурсиздоступданить Безопасностьиз,Доступно через механизм замка、Атомарные операции и другие средства контроля.
  2. тупик:существоватьиспользовать Замокизпроцесссередина,Будьте осторожны с появлением тупик,То есть несколько потоков ждут друг друга, чтобы освободить ресурсы.,В результате программа не может продолжать выполнение.
  3. Утечка ресурсов:существоватьмногонитьпрограммированиесередина,Ресурсы могут быть легко освобождены неправильно.,Например, нить не была закрыта должным образом или замок не был правильно снят.
  4. Ограничения GIL:существоватьCPUИнтенсивные задачисередина,Глобальная блокировка интерпретатора (GIL) может стать узким местом производительности,Многопоточность или другие модели параллелизма необходимо выбирать тщательно.

18. Изучите другие модели параллелизма

Хотя многопоточность является распространенной моделью параллельного программирования, это не единственный вариант. Python также предоставляет несколько других моделей параллелизма, в том числе:

  1. многопроцессное программирование:проходитьmultiprocessingмодульвыполнить,Каждый процесс имеет свой интерпретатор и GIL.,Подходит для задач с интенсивным использованием процессора.
  2. Асинхронное программирование:проходитьasyncioмодульвыполнить,На основе цикла событий и сопрограмм,Идеально подходит для задач с интенсивным вводом-выводом,Может улучшить параллелизм программы.
  3. параллельные вычисления:использоватьconcurrent.futuresмодульсерединаизProcessPoolExecutorиThreadPoolExecutor,Выполняйте задачи параллельно.

19. Постоянное обучение и практика.

Многопоточное программирование — обширная и сложная область, и эта статья — всего лишь руководство, с которого можно начать. Постоянное обучение и практика — ключ к глубокому овладению многопоточным программированием.

Рекомендуется прочитать официальную документацию Python и связанные с ней книги.,Узнать большеthreadingмодульиз Различные функцииииспользование。Участвуйте в проектах с открытым исходным кодом、читать другихизисточниккод,Это также отличный способ улучшить свои навыки.

21. Многопоточная асинхронизация и сопрограмма

В современном программировании Асинхронное программированиеисопрограмма成为处理高и发场景из重要инструмент。Pythonпредоставилasyncioмодуль,проходитьсопрограммавыполнить Асинхронное программирование. По сравнению с традиционной многопоточностью, Асинхронное программирование позволяет более эффективно решать большие объемы задач с интенсивным вводом-выводом.,Без создания большого количества тем.

Основы асинхронного программирования

Асинхронное программированиепроходитьиспользоватьasyncиawaitключевое слово для определениясопрограмма。сопрограммадалегкийизнить,Выполнение можно приостановить и возобновить во время работы.

Язык кода:python
кодКоличество запусков:0
копировать
import asyncio

async def my_coroutine():
    print("Start coroutine")
    await asyncio.sleep(1)
    print("Coroutine completed")

async def main():
    await asyncio.gather(my_coroutine(), my_coroutine())

if __name__ == "__main__":
    asyncio.run(main())

В приведенном выше примере,my_coroutineдаодинсопрограмма,использоватьasyncio.sleepмоделирование Асинхронные операции。проходитьasyncio.gatherЗапустить несколькосопрограмма。

Асинхронность и многопоточность
  • производительность: Асинхронное программирование相较于многонить,Может более эффективно обрабатывать большие объемы задач с интенсивным вводом-выводом.,Потому что асинхронные задачи могут передавать управление во время ожидания ввода-вывода.,Не блокирует выполнение других задач.
  • Сложность: Асинхронное По сравнению с многопоточностью программирование может быть сложнее писать и понимать. Вам необходимо быть знакомым с концепцией сопрограмм и асинхронного режима. программированиеиз Модель。
Пример: асинхронная загрузка изображений

Ниже приведен простой пример использования асинхронного программирования для загрузки изображений:

Язык кода:python
кодКоличество запусков:0
копировать
import asyncio
import aiohttp

async def download_image(session, url):
    async with session.get(url) as response:
        if response.status == 200:
            filename = url.split("/")[-1]
            with open(filename, "wb") as f:
                f.write(await response.read())
            print(f"Downloaded: {filename}")

async def main():
    image_urls = ["url1", "url2", "url3", ...]  # Замените URL фактического изображения.
    async with aiohttp.ClientSession() as session:
        tasks = [download_image(session, url) for url in image_urls]
        await asyncio.gather(*tasks)

if __name__ == "__main__":
    asyncio.run(main())

существовать В этом примере,проходитьaiohttpСоздание библиотеки асинхронноеHTTPпросить,asyncio.gatherВыполнять несколько одновременносопрограмма。

22. Обработка исключений в асинхронном программировании

существовать Асинхронное программированиесередина,Исключения также обрабатываются по-разному. в сопрограмме,нас通常использоватьtry-exceptзаблокировать илиasyncio.ensure_futureждатьспособ справиться саномальный。

Язык кода:python
кодКоличество запусков:0
копировать
import asyncio

async def my_coroutine():
    try:
        # Асинхронные операции
        await asyncio.sleep(1)
        raise ValueError("An error occurred")
    except ValueError as e:
        print(f"Caught an exception: {e}")

async def main():
    task = asyncio.ensure_future(my_coroutine())
    await asyncio.gather(task)

if __name__ == "__main__":
    asyncio.run(main())

существовать В этом примере,asyncio.ensure_futureВолясопрограммаупакованный в одинTaskобъект,проходитьawait asyncio.gatherждать Подождите, пока задание будет выполнено,Перехват исключений.

23. Преимущества и меры предосторожности асинхронного программирования

Преимущества
  1. Высокий параллелизм: Асинхронное программирование Подходит для больших объемовI/OИнтенсивные задачи,Возможность более эффективно обрабатывать одновременные запросы,Улучшите пропускную способность системы.
  2. Ресурсная эффективность: По сравнению с многопоточностью, Асинхронное программирование обычно более эффективно использует ресурсы.,Потому что сопрограммы легкие,Можетсуществоватьодиннитьсередина运行много个сопрограмма。
На что следует обратить внимание
  1. Блокирующая операция: Асинхронное программированиесередина,Операции блокировки влияют на весь цикл событий.,По возможности следует избегать блокировки вызовов.
  2. Обработка исключений: Асинхронное программированиеиз Обработка исключения могут быть более сложными,Нужно обращаться осторожносопрограммасерединаизаномальный Состояние。
  3. Применимые сценарии: Асинхронное программирование Даже Идеально подходит для задач с интенсивным вводом-выводом,а не задачи, интенсивно использующие процессор.

24. Изучите больше инструментов и библиотек асинхронного программирования.

Кромеasyncioиaiohttpснаружи,Есть и другие мощныеиз Асинхронное программирование инструментов и библиотек:

  • asyncpg Асинхронный драйвер базы данных PostgreSQL.
  • aiofiles Библиотека асинхронной работы с файлами.
  • aiohttp Асинхронный HTTP-клиент и серверная среда.
  • aiomysql Асинхронный драйвер базы данных MySQL.
  • uvloop Высокопроизводительный цикл событий, предназначенный для замены стандартного цикла событий.

25. Постоянное обучение и практика.

Асинхронное программирование – это широкая и глубокая тема.,Только эта статьядадля тебяпредоставилодин简要изпредставлять。Рекомендуется углубленно изучитьasyncioмодульиздокумент,Понимание цикла событий、сопрограмма、Асинхронные операцииждатьконцепция。

В то же время, практикуясь на реальных проектах, вы лучше поймете и освоите технологию и лучшие практики асинхронного программирования.

Подведите итог:

В этой статье подробно рассматривается многопоточное программирование и асинхронное программирование на Python. программирование,涵盖Понятномногонитьмодуль(threading)избазовые знания、код Настоящий бой,а также Асинхронное программированиемодуль(asyncio)из基本концепцияииспользовать。нас从многонитьиз База,нравитьсяThreadдобрый、механизм замка、нить Безопасностьждатьначинать,逐步展示Понятномногонитьсуществовать Практическое применениесерединаиз Сценарии примененияи На что следует обратить внимание. В примере показан процесс загрузки изображений через несколько потоков, при этом особое внимание уделяется потокобезопасности и Обработке. Важность исключений.

впоследствии,В этой статье представлена ​​концепция Асинхронного программирования.,проходитьсопрограмма、asyncиawaitКлючевые слова,а такжеasyncioмодульизиспользовать,Показывает читателям Асинхронное Основы программирования. Асинхронность подчеркивается на примере асинхронной загрузки картинок. эффективность программирования при решении задач с интенсивным вводом-выводом.

Статья также посвящена Асинхронному. программированиеиз Обработка исключений、Преимуществаи На что следует обратить внимание обсуждается подробно и представлены некоторые часто используемые Асинхронные значения. программирование инструментов и библиотек. Наконец, читателям предлагается углубить свое понимание многопоточности и асинхронности посредством непрерывного обучения и практики. Разберитесь в программировании и улучшите свои способности в параллельном программировании.

Будь то многопоточное программирование или асинхронное программирование, они являются ключевыми технологиями, позволяющими улучшить параллелизм, производительность и скорость реагирования программ. Благодаря глубокому пониманию этих концепций читатели смогут лучше справляться со сложными требованиями параллелизма в современном программировании и улучшить свои навыки программирования. Желаю читателям плодотворных результатов в изучении многопоточного и асинхронного программирования!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose