>  기사  >  백엔드 개발  >  golang의 슬라이스를 사용한 동시 매핑

golang의 슬라이스를 사용한 동시 매핑

WBOY
WBOY앞으로
2024-02-11 09:57:091136검색

golang 中带有切片的并发映射

php 편집기 Banana는 golang의 슬라이스 동시 매핑에 대한 훌륭한 기사를 가져왔습니다. 이 기사에서는 동시 환경에서 매핑 작업에 슬라이스를 사용하는 방법을 살펴보고 동시 프로그래밍에서 슬라이스가 왜 매우 유용한지 설명합니다. golang의 동시성 메커니즘을 사용하면 여러 고루틴의 슬라이스에 동시에 액세스하고 수정할 수 있으므로 프로그램의 성능과 효율성이 향상됩니다. 당신이 초보자이건 숙련된 golang 개발자이건 간에, 이 글은 당신에게 귀중한 지식과 실용적인 기술을 가져다 줄 것입니다. golang에서 슬라이스를 사용한 동시 매핑을 살펴보겠습니다!

질문 내용

몇 ​​달 전 현장 개발자 중 한 명이 떠난 후 동시성 문제를 해결하려고 노력했지만 이 문제를 해결할 적절한 방법을 찾을 수 없습니다.

컨텍스트에 따라 고객 데이터를 다음과 같은 구조로 로드합니다.

[ 键 ] -> { 值 }

[客户特定哈希] -> {数据点/文件切片}

예 - 형식이 정말 잘못되었습니다. 죄송합니다.

으아악

위의 내용은 100,000명의 고객이 있고 매일 밤 각 고객의 해시(또는 실제로는 버킷)를 기반으로 데이터를 통합하는 프로세스를 시작하기 때문입니다. 데이터프레임을 처리하기 전에 조각을 반복하고 데이터프레임을 많은 법률/회계 규칙이 포함된 하나의 큰 데이터프레임으로 "병합"합니다.

모든 데이터 포인트를 가능한 한 빨리 인덱싱하기 위해 고루틴에서 실행됩니다.

따라서 구현은 본질적으로 sync.Map[string, []DataFrame]입니다. 그러나 맵 작업은 보호되지만 데이터프레임 슬라이스에 추가하는 것은 보호되지 않는다는 것을 알았습니다. 각 해시에는 해당 조각에 밤마다 약 20-30개의 파일 참조가 있을 것입니다.

지난 2년 동안 고객 데이터가 잘못 병합되었을 가능성이 높으며 이를 수정하는 임무가 저에게 있습니다. sync.map 이전에는 Map과 함께 RWMutex를 다시 사용했지만 슬라이싱은 사용하지 않았습니다. 이는 이 문서를 가이드로 가리키는 것입니다.

먼저, 슬라이스를 포함하는 맵이라는 아이디어가 적절한 데이터 구조인가요?

RWMutex를 기반으로 슬라이스 핸들러를 만들려고 하는데 맵에 하나가 있을 수 있는지 궁금합니다. chan DataFrame 来代替在索引客户文件时放入,然后一旦完成,第二步将其合并到一个数组中(如len(chanx)) 알 수 있을까요?

저는 주로 Java 출신이라 몇몇 용어 때문에 헷갈릴 수 있어서 죄송해요.

Solution

두 가지 문제가 있습니다.

  1. 지도 업데이트 시 동시성 문제가 발생했습니다
  2. 지도 항목 업데이트 시 동시성 문제

sync.Map 1은 방지하지만 2는 방지하지 않습니다.

이 문제를 해결하는 한 가지 방법은 다음과 같습니다.

으아악

어디

으아악

지도에서 항목을 얻은 후에는 구조를 LockRLock 它,然后使用数据。这不仅仅限于切片的附加。即使您只从数据帧中读取,您也必须 RLock해야 합니다.

새 데이터프레임을 추가하려면:

으아악

위 내용은 golang의 슬라이스를 사용한 동시 매핑의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제