2020年2月2日日曜日

Python4에서 글로벌 인터프리터 잠금 (역주 : LL 언어의 스레드가 가지는 배타적 잠금 메커니즘) 문제가 해결되지 않는 경우. 2020.02.02 현재의 해결 방법. 이시즈카 마사히로 (aon CEO)

2020.02.02 현재
Python2 & 3는 글로벌 인터프리터 잠금 (역주 : LL 언어의 스레드가 가지는 배타적 잠금 메커니즘) 문제가 해결되고 있지 않습니다.

대체 방법으로,
WEB 사이트, 인트라넷, LINE 응용 프로그램 등의 개발에는 Go lang을 사용하여
AI와 기계 학습의 개발은 Python을 사용하여 Go lang에서는 WEB 사이트 + AI (Go lang 용 API 라이브러리) + AI (기계 학습) DATA의 이용이란 방법으로 해결하는 것입니다.

관련 정보 :

안녕 Python, 안녕하세요 Go

이다 :

이전 Python으로 쓰고 있던 같은 작업을 최근 Go에서 쓰게했다는 필자 의한 Python과 비교했을 Go의 장점이나 부족한 부분 요약

원문
Goodbye Python. Hello Go. (English)
번역 의뢰자
D98ee74ffe0fafbdc83b23907dda3665 Df3136f800e7ed9931ed5f9f1afad935
번역기
Df3136f800e7ed9931ed5f9f1afad935 mtsk
번역 리뷰어
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
원저자로 번역보고
502 일 전 원문에 댓글로보고 된 편집
 




나는 이전에 Python으로 쓰고 있던 같은 많은 처리 Go 언어를 사용하고 있습니다. 예를 들어 다음과 같은 작업이 포함됩니다.
  • Amazon S3에 저장되어있는 Cloudfront 로그 처리
  • S3 안팎에 거대한 (테라 바이트) 파일을 이동하는 작업
  • 데이터베이스와 S3 사이에서 동기화 된 파일의 매칭 처리
정말 대부분이 한번 뿐인 처리이며, 따라서 스크립트 언어로 작성하는 것이 이상적입니다. 그 프로그램은 빠르게 작성해야 바로 버려지는 가능성이 높습니다. 항상 이러한 작업은 새로운 독특한 것이니까, 재사용 코드는 최소화됩니다.
다음은 Python 대신 Go 언어를 사용할 수있는 장점을들 수 있습니다.

컴파일러를 갖추고있는 것이 좋은

나는 Python으로 정기적으로 하찮은 실수를합니다. 변수 이름 · 함수 이름을 잘못 입력하거나 잘못된 인수를 전달합니다. 개발 도구가 이들을 찾아 주지만 이러한 도구는 대개 특수한 초기 설정이 필요합니다. 아직도 pylint를 쉽게 설정할 수있는 예시가 없으며, 설정을 요구 본격적인 IDE를 좋아하지 않습니다.
최악의 경우는 변수의 오타를 조건 분기의 뒷면에 숨어 버리는 것입니다. 스크립트는 몇 시간 동안 실행 된 후 오류가 발생합니다. 그리고 모든 게 엉망이 된 후 다시 실행해야합니다.
유닛 테스트는 많은 문제를 찾을 수 있습니다. 그러나 100 % 카바레지하는 것은 곤란이며, 일회성 스크립트에 대한 단위 테스트를위한 시간을 보내고 싶지 않아.
컴파일 언어는 이러한 문제를 모두 해결 해줍니다. 컴파일러가 이러한 실수를 찾아줍니다. 이러한 이유로 수백 줄 이상의 데이터를 처리하기 위해 Go 언어를 좋아합니다.

개발 속도

컴파일러 언어가 가진 단점은 개발 속도가 느려질 수 있습니다. 이것은 C / C ++, Java에서는 특히 그렇습니다.
개발 속도가 최소화되어있는 것을 알 수있는 장면에서는 Go는 아주 간단합니다. 나는 아직 Python을 신속하게 걸쳐 있지만 go 언어의 생산성은 python에서 작성하는 경우에 대해 85 % 정도입니다.
85 %는 나쁘지 않은 수치입니다. 왜냐하면 컴파일러를 사용하면 미세한 실수가 많이 줄어들 기 때문입니다.

병렬 처리의 이점

알고 그대로 Go는 처음부터 병렬 처리를 위해서 만들어진 것입니다.
우리 팀은 잘 S3와 데이터베이스에서 대량의 데이터를 처리하기 위해 병렬 처리 프로그램을 필요로하고 있습니다.
만약 작업이 IO에 부하를 거는 것이라면, Python의 스레드를 이용하면 해결할 수 있습니다. 그러나 CPU에 부하를 거는 작업라면 Python은 글로벌 인터프리터 잠금 (역주 : LL 언어의 스레드가 가지는 배타적 잠금 구조)의 관점에서 어렵습니다.
나는 multi-thread Go 언어에서 특별한 일을하지 않아도 간단하게 처리가 진행 모습을 즐겨도 있습니다. 당신이 멀티 스레드 처리중인 Python Ctrl-C를 사용했을 때, 아무 문제 없었나요?

배포 용이성

싱글 바이너리를 다루는 것을 좋아합니다. 나는 종종 EC2에서 코드를 실행합니다. 스크립트와 S3 데이터베이스와의 통신 경로를 더 가까이 때문입니다. Python으로하는 경우에는 필요한 모든 패키지가 원격 컴퓨터에 설치되어 있으며, 다른 동료가 설치된 무언가 충돌하지 않으며, 보증 할 필요가 있습니다.
Virtualenv 이 주로이 문제를 해결 해주고 있지만, 역시 Go 언어 쉽습니다.
대개는 Mac go 언어 코드를 Linux 용으로 크로스 컴파일하고 그것을 원격 컴퓨터에 복사하여 실행하면됩니다. 모든 의존성은 바이너리 속에 내포되어 있습니다.

일관적인 스타일 (서식 설정)

처음에는, gofmt 도구 초조했습니다. 특히 공백 대신 탭 들여 쓰기를 사용하는 것이 괴롭습니다. 보통이 아니라고 생각했습니다.
그러나 사용하고있는 사이에, gofmt 에 의존하게되었습니다. 아무런 배려도하지 않아도 자동 서식하는 것으로, 포맷 성형에서 해방되었습니다. 내 모든 코드는 자신이 담당하는 어떤 프로젝트에도 항상 일관된 포맷 스타일로 유지됩니다. 포맷 성형은 Go 언어의 표준 도구의 특징이기 때문입니다.
Python에서 유사한 효과 (일관된 형식)을 얻기 위해서는 더 많은 비용이 소요됩니다. 나는 pylint 를 올바르게 설정하고 모든 프로젝트에서 일관성 있는지 확인해야 안됩니다.

도구의 이점

이 예 중 하나는 바로 gofmt 을들 수 있습니다. 내가 사용하는 어떤 편집기 (VSCode, vim, Sublime Text)에서도 모든 뛰어난 Go 언어의 확장 기능을 사용할 수 있습니다. 이것이 Go 언어가 표준 기능으로 도구를 제공하는 것을 장점입니다.
이 혜택의 결과로 IDE를 사용하지 않고, Java에 유사한 인텔리 센스 (역주 : 보완 기능)을 제공합니다. Python에서 지금까지이 기능에 접근 적은 한 번도 없습니다.

부족한 부분

내가 Go 언어에 대한 비판을 보게 될 때마다, Go 부족한 기능 (제네릭과 같은)에 기인하고 있습니다. 나는 한번도 제네릭이 없다하여 큰 문제를 우연히 본 적이 없습니다. (당신은 map과 slice 의해 얼마나 할 수 있는지를 알게되면 놀랄 것입니다.)하지만 다른 많은 문제에 직면했습니다.

Go 언어는 의지를 주장하고 너무

Go 언어는 지금까지 쓴 언어 중에서도 주장하는 언어입니다. 공백 대신 탭을 강요하는 (당신이 gofmt 을 이용하고 있다고 가정)에서 시작하여 특정 디렉토리 구조를 이용하여 환경 변수 GOPATH에서 코드를 작성하는 것까지. 이러한 많은 Go 언어의 특징은 쉽게 바꿀 수 없습니다.
Go 언어의 학습 비용이 낮은 이유 중 하나는 이러한 특징을 바꿀 수 없기 때문입니다. 만약 대문자로 시작하는 이름 (함수 · 변수 등)를 외부 공개하고 싶지 않으면, 그때는 매우 좋지 않습니다. 다행히도이 나에게 말썽 꾸러기는 아니지만 다른 사람의 것이라면 이해할 수있었습니다.
Python은 더욱 더 유연합니다.

라이브러리가 제공하는 것이 적은

이 관점에서 Python과 Go 언어를 비교하는 것은 공정하지 않습니다. Go 언어 쪽이 아주 새로운입니다. 그러나 나가, Go 언어가 지원하지 않는 기능을 발견했을 때 당황합니다. 내장 함수이어야 코드가 StackOverflow에 게시, 또 모든 사람이 그 코드를 복사하여 자신의 프로젝트에 붙여 문제가 없도록 행동 할 때 더욱 당황 것입니다.
두 가지 예 (최근 몇 년 사이에 떠오르는 예) :
  • slice 정렬 (다행히도 Go1.8 이후에는 볼 수 있습니다)
  • Math.round가 integer 만을 취급, float 변수가 취급 할 수없는 (예를 들어, 0.5로 반올림하고자하는 경우에). 또한, Go1.10 이전에는 Math.round조차하지 않았습니다.
그대로 이들 중 일부는 Go 언어가 제네릭이없는 것에 기인하고 있으며, Go 언어 개발자가 꼭 필요한 것만을 표준 라이브러리에 추가하는 전략을 따르는 때문이기도합니다.
나는 위의 두 점을 이해하고 있습니다. 하지만 직접 구현해야 말라 세세한 기능에 접하게되면, 역시 귀찮은입니다.
Go 언어가 발전함에 따라 이러한 번거 로움이 적게되어가는 것을 바랍니다.

〒197-0828
도쿄도 아 키루 노시 秋留 5-3-11
5-3-11 Akiru Akiruno-City Tokyo Japan
aon (에 이온) CEO
이시즈카 마사히로
(MASAHRIO ISHIZUKA)
TEL : 042-559-8638
iPhone : 070-3861-5011
FREE CALL PHONE

+81 50 5532 0868

Skype
live : cloud9slack
http://aon.tokyo
http://aon.co.jp 준비 중
cloud9slack@gmail.com

0 コメント:

コメントを投稿