Jupyter command jupyter-contrib not found. 지금 이 오류가 떠서 설치가 안되고 있는데요. 어떻게 해결해야 할까요?? 제가 봤을땐, pip install jupyter_contrib_nbextensions 이 부분은 실행이 되는데 jupyter contrib nbextension 이 부분에서 오류가 생기는 것 같습니다. ㅠㅠ
클래스 정의하고 호출하면 42번 줄에 player1에 해당하는 height와 weight의 값이 둘 다 나와야 하는데 저는 한가지 값만 출력이 됩니다. weight를 지우고 height 값만 쓰면 height값이 출력되고 둘다 쓰면 height값은 안나오고 weight값만 출력이 되는데 왜 이런 걸까요?
선생님 안녕하세요. 강의를 듣다가 조금 이상한 부분이 있어서 문의드립니다. [ 스레드 풀 이해와 구현 ] 강의에서 작성하는 코드를 저도 그대로 따라치면서 실습을 하고 있는데요. 그런데 예시 코드의 동작에 약간의 문제를 발견했습니다. 강의에서 보여주는 코드는 아래와 WorkerThread 코드는 아래와 같습니다. 그런데 제가 한 ThreadPoolMain 클래스에서 Task 를 3000 개 정도 주고, ThreadPoolSize =20 을 주고 돌려보니까, 2가지 이상현상을 확인했습니다. 1. Null Poiniter Exception 발생 중복 처리 각각의 문제가 발생하는 이유를 정리해보니 다음과 같더라구요. NPE 발생 원인 // 시나리오 1 if (!taskQueue.isEmpty()) { // 쓰레드 A,B 2개가 동시에 여기에 접근 // 쓰레드 A 가 먼저 Poll 을 해서 가져가버림. // 쓰레드 B 는 비어있는 Queue 에 대하여 poll, null 을 반환 받음 task = taskQueue.poll(); } else { continue; } // 쓰레드 A 는 정상 시작 // 쓰레드 B 는 NullPointerException! task.run(); 중복처리 원인 // 시나리오 2 if (!taskQueue.isEmpty()) { // 쓰레드 A,B 2개가 동시에 여기에 접근 // 쓰레드 A 가 먼저 Poll 을 해서 가져 가버림. // 쓰레드 B 도 Poll 해서 task 를 가져감. task = taskQueue.poll(); } else { continue; } // 쓰레드 A 는 작업 시작 // 쓰레드 B 도 중복으로 해당 task 실행 task.run(); 혹시 코드를 아래처럼 짜야 되는 게 아닌지 조심스럽게 문의해봅니다.
안녕하세요. 비동기 작업 조합 강의 38분 30초대를 듣다가 질문이 생겼습니다. 인텔리제이 콘솔에 '최종 결과: 10'으로 출력되고 있는데요. 궁금한 점은 아래와 같습니다. 비동기 처리 과정이 제일 적은 cf1의 리턴 값은 10이다 AnyOfExample.java 19 Line에서는 result * 10으로 계산이 되고 있다. 따라서 100이 나올 것으로 예상을 했는데 10으로 출력되는 것으로 보아 2번 계산 과정을 스레드가 실행하지 않은 건가 싶어서요. 혹시 제가 놓치고 있는 부분이 있나 해서 질문드립니다.
<상황>지식 공유자님께서 작성해주신 C# 코드 예제를 코틀린으로 비슷하게 작성해서 시도해보았지만 같은 상황이 재현되지 않습니다. <질문 의도>제가 지식 공유자님의 코드를 잘못 이해하고 작성한 것인지, 아니면 JVM의 의도치 않은 최적화 때문에 의도와 다르게 동작하는 것인지 궁금합니다. <작성한 코드> fun main (args: Array<String>) { Example().startUp() } class Example() { private var shouldStop = false fun startUp() { println("process start") val thread = Thread(Runnable { doWork() }) thread.start() Thread.sleep(1000) shouldStop = true thread.join() println("process end") } // shouldStop에 @Volatile을 붙이지 않으면 무한 루프를 돌 것이라고 생각했으나 // graceful shutdown이 잘 되어버림 private fun doWork() { while (!shouldStop) { println("doWork..") Thread.sleep(1000) } } } 좋은 강의 만들어주셔서 감사합니다!
안녕하세요~~ 루비네 코딩 입니다 ^^ 최근 앱을 런칭할 때 다음과 같은 오류가 발생하고 있습니다. ModuleNotFoundError: No module named 'altair.vegalite.v4' 이런경우, 다음과 같이 altair 패키지의 버전을 바꾸어 설치해 주세요 ^^ 감사합니다~ pip uninstall altair pip install altair==4.2.2
병렬성과 동시성은 동시에 실행된다는 내용만 같고 구체적인 처리 방식은 달라보이는데 '병렬성은 동시성의 하위 개념'이다 라는 내용이 이해가 안갑니다. 만약 동시성이 여러 일이나 사건이 동시에 발생하거나 진행되는 상태를 말한 개념을 말한거라면 '병렬성은 동시성의 하위 개념'이다 라는 내용이 이해가 가는데 강사님께서 설명한 특정한 순서 없이 겹치는 기간에 시작, 실행 및 완료 되는 여러 작업에 관한 동시성에 대한 개념으로 '병렬성은 동시성의 하위 개념'이다 라는 내용을 이해해볼려 하면 이해가 안되는 것같습니다. 만약 해당 동시성이 후자라면 어떻게 '병렬성은 동시성의 하위 개념'이 되는지 궁금합니다.
강의 정말 잘 듣고있습니다!! 제 프로젝트에서 회원가입API에 회원가입과 메일전송이있고 메일전송을 스프링의 @Async로 처리하고 있는 상황입니다. 1. 만약 CPU가 1대라면 API호출한 스레드와 비동기 스레드가 context switching 발생하면서 처리되는게 맞을까요? 2. 만약 100개의 요청이 회원가입 API에 몰리고 cpu가 1대라면 Async전용 스레드풀의 스레드 개수는 어떻게 될지 짐작이 안갑니다. 일반적인 애플리케이션 스레드풀은 강의해주신대로 스레드풀 사이즈, 큐 사이즈 등에 따라서 그림이 그려지지만.. Async전용 스레드풀도 똑같이 100개의 요청이 한번에 들어와 애플리케이션 스레드풀처럼 동작할까요..?
우선 좋은 강의 감사드립니다. 강의내용중 running -> runnable 로 이동하는 방법에 yield, I/O 가 있다고 하셨는데, DB query 등을 하면 응답이 올때까지 waiting으로 상태변경이 되는게 아닐까 싶어 샘플코드를 짜보니 정말로 running-> runnable 상태이던데, 1) 응답이 올때까지 기다리는 것이기도 하고 2) runnable 이면 언제라도 running이 될수 있는데, 이 경우 running -> runnable -> running 으로 상태변경되었는데 아직 응답이 오지 않았으면 다시 runnable 로 넘어가고.. 이런게 반복되는건가요? 샘플코드는 아래와 같이 만들어봤습니다. RestTemplate template = new RestTemplate(); template.getEntity(xxx); // 응답이 10초 걸리는 api 호출 10초 내에 위 작업을 하는 쓰레드의 상태를 log 로 찍으니 runnable 로 나왔습니다.
안녕하세요. 강의를 듣다가 궁금한 점이 있습니다! CPU 코어 수보다 작업 수가 같거나 많은 경우 병렬성 처리 + 동시성 처리 CPU 코어 수보다 작업 수가 적은 경우 병렬성 처리 이렇게 이해를 했는데요. '작업 수'라는게 정확히 어떤 작업을 말씀하시는 건가요? 예를 들어, jar를 nohup으로 실행하면 프로세스 하나가 실행되는데 이 안에서 작업이라는거는 어떤 것을 말씀하시는 건지 궁금합니다. (자바 메서드를 실행하거나 그런건 아닌거 같은데..) 그리고 하나 더 궁금한 점이 있는데요. 만약 java main 메서드가 실행되어 "hello world"라는 출력을 한다고 하면, CPU가 스케줄 알고리즘으로 프로세스에 할당한 커널레벨 스레드가 자바의 main 스레드를 call 해서 main 스레드가 "hello world"를 찍는 건가요? 아직 제가 강의 뒷부분을 안들어서 그런건지..ㅋㅋㅋ
안녕하세요 연구실에서 자체적으로 실험기기와 컴퓨터랑 통신을 진행하는 중인데, 하나가 해결이 안 되어서 너무 답답해서 고수님들께 자문을 구하려고 합니다. Rs232 rtu 모드를 지원한다고 한 OS-20 overhead stirrer과 통신을 진행 중 입니다. 이 친구의 통신 규격과 방식은 아래 그림 3개와 같습니다. 이중 stirrer control 부분을 제가 참조해서 저 command를 hex 방식으로 입력하였는데 도무지 안되는 겁니다. 그런데 웃긴게 이 회사에서 지원하는 공식 통신프로그램을 사용하면 작동이 잘 되더군요. Instruction overview에서 나온 규칙은 다음과 같습니다. Command 구조는 Prefix Instruction_code Data_frame Checksum로 되어 있고 입력의 prefix는 0xfe로 시작하며 responce는 0xfd로 시작합니다. 모든 바이트 사이에는 50ms delay가 존재해야하며 Dataframe은 큰 수 자리부터 전송합니다. ex) 1000rpm을 data frame에 입력하려고 할 시 Hex값이 03E8이니까 앞에 두 자리를 0x03에 해당하고 뒤에 두 자리를 0xE8로 해당시킵니다. Null은 0x00입니다. Checksum 방식은 0xfe,0xfd인 prefix를 제외하고 나머지를 전부 더한 값으로 0xnn 이런식으로 표현됩니다. 신기하게도 16진수의 2자리를 넘어가도 뒤에 2 자리만 붙이면 된다고 하더군요. ex) 0xfe 0xb1 0x03 0xe8 0x00 checksum인데 0xfe를 제외하고 다 더하면 019c이지만 0x9c만 입력하면 되는 형식입니다. 그래서 이 규칙대로 코드를 짜서 통신을 해 보았는데, 아무리 해도 안되어서 너무 답답합니다. 심지어 제가 잘못했는지 확인하려고 시리얼 통신 sniffer을 사용하여서 공식 프로그램에서는 어떻게 통신이 되나 뜯어보았습니다. 결과는 아래 사진과 같습니다. 제가 python으로 작성한 코드는 아래와 같습니다. import serial import time ser = serial.Serial( port='COM7', # Update with your actual port baudrate=9600, parity=serial.PARITY_NONE, # No parity stopbits=serial.STOPBITS_ONE, # 1 stop bit bytesize=serial.EIGHTBITS # 8 data bits ) def send_hex_string(hex_string): # Convert the hex string to bytes byte_data = bytes.fromhex(hex_string) # Send the bytes over the serial port ser.write(byte_data) def send_hex_string_with_delay(hex_string, delay_ms=50): for i in range(0, len(hex_string), 2): # Extract each pair of characters and convert to bytes hex_pair = hex_string[i:i + 2] byte_data = bytes.fromhex(hex_pair) # Send the bytes over the serial port ser.write(byte_data) # Wait for the specified delay time.sleep(delay_ms / 1000.0) command = 'feb103e8009c' send_hex_string_with_delay(command) ser.close() 또한 파이썬에서의 결과를 시리얼 전송으로 보면 다음과 같습니다. 입력은 제대로 되는데 기기에는 반응이 제대로 나오지 않네요... 제가 잘못하고 빠뜨린 점이 있을까요? 읽어주셔서 정말 감사드립니다.
안녕하세요 선생님, 질문이 있어서 글 올립니다. [스레드 간 협력 - wait() & notify() 강의 - 6:23 ] 즈음에 "notifyAll 이 더 선호된다"... 라고 했는데, 제가 뭘 놓친 걸 수도 있지만, 잘 이해가 안됩니다. 왜 notfiyAll 이 선호되는지에 대한 핵심적인 이유를 알려주실 수 있을까요?
메인스레드는 어플리케이션을 실행하는 최초의 스레드이자 어플리케이션 실행을 완료하는 마지막 스레드의 역할을 한다 고 되어있는데 제공해주신 예제 코드 chaper02 의 exam02 MultiThreadAppTerminatedExample 를 실행 시켜보면 메인스레드 종료가 먼저 출력 된뒤 다른 스레드들이 실행 중 이라고 출력 됩니다. 그러면 예제 코드에서 System.out.println("메인 스레드 종료"); 가 호출 된 뒤 실제로는 메인 쓰레드가 종료되지는 않고 다른 스레드들이 다 종료 될 때 까지 대기 중인 상태 인가요?