60,500원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
내장함수 볼 수 있는 extension
thread(3) - ThreadPoolExecutor 강의에서5분 54초쯤 적용돼있는 extension 이름이 뭔가요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
안녕하세요. 질문 있습니다
print(task.result()) 또는 print(list(tasks)) 를 사용 했을때 결과값이 None으로 나오는건 왜그런걸까요...? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
맥 가상환경 실행시에
안녕하세요.... 강의를 맥에서 따라 하면서 듣고 있는데 강의에서처럼 python_ex라는 가상환경 폴더를 생성하고 지금까지는 잘 진행중인데, import requests 부분 부터는 오류가 납니다. 가상환경에서 pip로 설치하여 커맨드 창에서는 에러가 안나는데 Vscode 상에서는 오류가 납니다. 오류는 ModuleNotFoundError 입니다. Python 인터프리터 선택하여 가상환경의 bin폴더에 있는 python3를 선택하면 왼쪽 맨 아래에 python 3.10.0 64-bit 라고 제대로 뜨는데 여기를 클릭하면 경로가 가상환경의 bin이 아닌 /Library/Framework/Python.framework/Versions/3.10/bin/python3.10 으로 바뀌어 있네요... 가상환경 bin폴더의 python3를 보니 위 경로로 링크가 되어 있어서 그러는 듯 합니다. 윈도우에서는 실행파일이 그대로 복사되어 있는데 맥은 링크만 하는 것 같아요. 이럴 때 어떻게 해야 vscode에서 제대로 실행을 할 수 있을까요??
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
manager.list() 질문
안녕하세요 선생님 manager.list() 객체가 공유된다고 말씀하셨는데 혹시 해당 객체는 어느 프로세스의 메모리 영역에 저장되는 것인지요. 메인 프로세스인가요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
메인 프로세스의 실행 흐름에 대해 궁금한 것이 있습니다.
안녕하세요 선생님 py_ad_2_6_1.py를 실행하면서 생긴 궁금증이 있습니다. 제가 임의로 다음과 같이 process.join() 뒤에 프린트 문을 넣었습니다. for process in processes: process.join() print('s', end=' ') 그래서 실제 어떻게 찍히는 지 봤더니 다음과 같았습니다. Process ID: 7380, Process Name: 10Result : 100000000s s s s s s s s s s s s s s s s s s s s --- 4.202337026596069 seconds --- 즉 모든 서브프로세스(여기서는 20개 설정했습니다.)가 작업을 끝마치고 join for 문이 돈 거 같습니다. s가 그 이후에 쭈르륵 프린트 된 것을 보면요. 근데 join을 했기 때문에 메인 프로세스가 다음 단계로 넘어가지 않고 기다리는 것 같은데 어떻게 바로 s가 찍히지 않고 join을 실행할 수 있었는지 궁금합니다. 모든 서브 프로세스에 join을 걸기 위해선 print(s)를 반드시 하고 넘어가야 하는 것 처럼 보이기 때문입니다. 감사합니다.
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
ProcessPoolExecutor에서 URL호출이 SSL에러
ProcessPoolExecutor 강의에서 urllib.request.urlopen에서 다음과 같은 오류가 발생합니다. 'http://www.daum.net/' generated an exception : <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certification chain (_sdsl.c:997) 이 오류 해결할 수 있는 방법이 있나요? 환경은 맥 / vscode 입니다.
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
future dict 생성에 대해서 질문있습니다.
객체가 딕셔너리의 키값이 되는 경우를 처음봐서 신기하네요. 객체를 키값으로 사용하는 경우가 많나요? url을 key로 두고 객체를 value로 하는 것보다 장점이 있나요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
생성할 수 있는 프로세스의 개수에 대해서 질문있습니다.
parallelism에서 병렬실행이라는 것은 실제 멀티코어에서 동작하므로 싱글코어는 수행할 수 없다고 하셨습니다. 그러면 멀티코어에서도 코어 수 이상의 프로세스를 병렬실행할 수 없는 것 아닌가요? 16코어 환경에서 50개의 멀티프로세싱하면 어떤 방식으로 실행하나요? 코어 수 이상의 프로세스는 병렬성과 동시성을 모두 사용해서 멀티프로세싱을 수행하는 것인가요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
join함수의 호출타이밍에 대해서 궁금한게 있습니다.
프로세스에 대해서 join을 호출하는데 아직 프로세스 타겟함수 로직이 안끝나면 어떻게 하나요? 만약 해당 프로세스가 종료될때까지 기다리고 join을 한다면 process list에 있는 다른 프로세스들은 해당 프로세스의 종료를 기다려야하는 것인가요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
DaemonThread 생성시
강의중 설명하신 예제에서 y쓰레드만 데몬쓰레드로 지정할 경우 올바로 동작을 안하네요. 데몬쓰레드로 할 경우 서브쓰레드 모두를 데몬으로 지정해야 하나요? y쓰레드만 데몬으로 지정하고 실행하면 메인쓰레드가 종료된 후 x, y쓰레드 모두 종료가 된 듯 한데 프로세스는 계속 남아 있습니다. 강제 종료 해야 되네요...
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
멀티프로세싱 질문
안녕하세요, 강사님. 좋은강의를 좋은기회로 제공해주시는데 제가 너무 많은 질문을 하지 않는가 죄송스럽네요... 강의가 너무 좋아서 복습하다가 헷갈리는 부분들을 다시한번 여쭤봅니다. 1. 멀티프로세스 데이터공유 방법 중 Value, Array는 acquire/release를 안해주면 프로세스가 그 변수에 접근하는 순서는 보장할 수 없는것이 맞는것이죠? (thread에서 배운 Lock 개념처럼) 2. 파이썬 코드에서 parent process가 있고 제가 만든 child process가 있을때, child process가 끝났다면(is_alive()가 False로 더이상 그 프로세스는 뭔가 더 하는일이 없음) 그 child process가 자원을 사용 안한다고 이해해도 되나요? 아니면 그래도 역시 쓸데없는(?) 자원 소비가 있을까요? 만일 있다면, 어떻게 그것을 방지할 수 있을까요? 3. 2번과 유사하게... thread에 대해서도 is_alive()가 False면 그 thread가 쓸데없이 작동하는 경우는 없다고 이해하면 되나요? (잘은 모르지만 multi-thread는 concurrency 개념으로 일정시간별 반복되며 여러 쓰레드가 작동된다 이해하고 있습니다) 만일 아니라면, 그 더이상 하는일 없는 thread는 작동되지 않도록 추가작업을 어떻게 해줘야 하나요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
with ProcessPoolExecutor(max_workers=5) as executor: 문의
안녕하세요, 강사님. with ProcessPoolExecutor(max_workers=5) as executor: 구문을 쓸 때 설명해주신 말씀이 'with문으로하면 close도 안해도 되서 편하다' 라고 해주셨는데... with문을 쓰는 이유가 어떤 thread/process를 만들어놓고, 그것을 다쓰고, with문을 나갈때 자동으로 close를 해주는 이유도 있을까요? 역으로 말하면 with문을 쓰지 않는다면... 제가 만든 thread/process는 제가 안쓸때 kill?terminate?를 해야지 컴퓨터 자원을 안쓰나요? 아니면 그냥 thread/process가 더이상 할내용이 없어서 끝나면 자동으로 더이상 컴퓨터 자원을 안쓰게되나요? 감사합니다.
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
스레드 실행 순서
강의코드 똑같이 작성했는데 실행순서가 왜 다른지 잘 모르겠습니다 3.9.5 버젼입니다. 터미널 창: 19:41:09 : Main-Thread: before creating thread 19:41:09 : Main-Thread: before running thread 19:41:09 : Main-Thread: wait for the thread to finish 19:41:09 : Main-Thread: all done 19:41:09 : Sub-Thread First: starting 19:41:12 : Sub-Thread First: finished import logging import threading import time # 스레드 실행 함수 def thread_func(name): logging.info("Sub-Thread %s: starting", name) time.sleep(3) logging.info("Sub-Thread %s: finished", name) # 메인 영역 if __name__ == "__main__": # 메인 스레드의 흐름을 타는 시작점. # Logging format 설정 format = "%(asctime)s : %(message)s" logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S") logging.info("Main-Thread: before creating thread") # 함수 인자 확인, 스레드 하나 생성, 타겟 : 스레드에서 만들 함수 x = threading.Thread(target=thread_func, args=('First',)) logging.info("Main-Thread: before running thread") # 서브 스레드 시작 x.start() # x.join() # 이게 있으면 메인은 스탑되고 서브 스레드 끝나고 나서 밑에 실행 logging.info("Main-Thread: wait for the thread to finish") logging.info("Main-Thread: all done")
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
sync, async 질문
안녕하세요, 좋은강의 감사드립니다. 아래 질문에 답변주시면 감사합니다! [1] sync/async, blocking/non-blocking 의 경우의수가 4가지가 있다고 배워습니다 (2*2) 그런데 강의를 보다보면... (I/O Bound - (2) 강의) sync는 자연스럽게 blocking이 된 상황들이고 async는 자연스럽게 non-blocking이 된 상황들로 보여집니다. 파이썬 코드에서 따로 async 관련을 안쓰면 자연스럽게 sync-blocking이 되는것이고, 모든걸 async를 신경써서 쓰면 자연스럽게 async-nonblocking이 되는것인가요? [2] multi - thread/process 는 Queue를 이용해서 어떤 thread/process에서 작업이 끝나면 데이터를 다른 thread/process로 보내줄 수 있다고 이해를 하고 있는데요... async의 경우는 함수에게 어떤일을 시키고, 그 함수가 끝나면 끝났다! 라고 알려준다고 이해를 했는데... 이때는 그 시점? 끝나서 반환하는값? 을 어떻게 알아차리나요? 예를들어 single-thread/process에서 함수A를 일을 시키면 곧 함수A가 끝났을때 100을 리턴한다고하면, 리턴받은 값을 가지고 추후 작업을 처리하고자 할텐데... 어떻게해야하나요? 무한대기하고있으면서 함수A가 끝났다고 말해주면(이건 어떻게 catch를 하는지...?), 그 값(이건 어떻게 catch를 하는지...?)을 갖고 처리하거나 등으로 하나요? 간단한 코드 예시가 있으면 감사합니다!
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
강의 - 섹션2. Parallelism with Multiprocessing 질문
안녕하세요, 강사님. 항상 좋은강의에 감사드립니다. 섹션2을 다 듣고나서, 스스로 정리를 하고 궁금한 부분들을 한번에 질문드립니다. 제가 컴퓨터쪽 전공이 아니라서 용어나 잘 모르는 부분이 많아 질문이 깔끔하지 않은점 이해 부탁드립니다. (섹션1도 다 듣고 동일한 방법으로 질문을 최근에 해서... 혹시 게시판에 도배가 되지 않을까 실례됩니다. 너무 질문이 잦다면 말씀주세요!) 그리고 제 질문들이 당연한것일수도 있는데... 강사님께 한번 더 확인(?)을 받으면 더 효율적으로 이해가되서 문의드립니다^^! 질문이 많고 clear하지 않음에 다시한번 양해를 부탁드리며, 미리 답변에 진심으로 감사드립니다. 0. thread와 process 관련 high-level로 만들어놓은 라이브러리를 concurrent.futures로 알고있습니다. 그 기반(low-level)은 threading과 multiprocessing으로 이해하고 있고요. 그런데 thread 강의에서는 대부분 concurrent.futures이용해서 multi-thread를 구현하셨는데, process 강의에서는 오히려 multiprocessing을 더 많이 쓰시는 것 같습니다. (concurrent.futures이용은 적어보임). 혹시 multi-processing은 concurrent.futures보다는 multiprocessing 라이브러리가 더 자주쓰이고 일반적인가요? 1. 숫자를 0부터1억까지 순서대로 더할때(0+1+2+...+1억), '1스레드/1프로세스'로 하는것과 '#스레드/#프로세스'로 하는것 중 어느것이 일반적으로 더 빠른가요? 잘은 모르지만... 숫자를 share하면서 가야하기때문에 (현재 어디까지 더한지를 알아야하니) '#스레드/#프로세스'는 굳이 switching(?)만 해야해서 더느릴것같은데... 이런생각이 맞나요? 더 나아가서 share하는 변수(상태를 연속적으로 알아야하는)가 있으면 하나의 스레드/프로세스에서 하는게 제일 빠르다고 생각해도 되나요? 2-1. parent thread/process에서 child thread/process를 만들고, 그 child가 할일을 다하면(더이상 실행할 코드가 없으면) 그것을 종료하는것이 자원관리에 효율적이라고 생각합니다. with문을 쓰면 자동으로 with문 내에서 정의된 child들이 다 끝나고 나서 with문을 나갈때 그 안에서 정의되었던 child들이 자원을 더이상 안쓴다고 생각하면 되나요? 그리고 역으로 with문은 with문 내에서 만들어진 child가 다 끝날때까지 with문 밖으로(들여쓰기 밖) 못나간다고 생각하는게 맞는 생각인가요? 2-2. 그러면 역으로 child는 무한으로 돌고, parent는 할일을 하고싶다면, with문내에서 그러한 child들을 정의하면 안될 것 같은데 (끝나지 않아 못나오니).... 이럴 경우에는 추후에 child가 끝나면, 제가 억지로 그 child의 자원사용을 막기위해 close(?)같은 걸 해야할 것 같은데... 어떻게하나요? 자동으로 파이썬이 작업을 안하는 therad/proecss는 자원을 안쓰도록 관리하나요? (ex. is_alive()나 .running()으로 찍었을때 False면 자원 안쓰도록) 3. (Thread부분이지만 Process에서도 동일할거라 생각) concurrent.futures.TheradPoolExecutor에서 submit을 통해 만들어지는 child thread가 daemon이 되도록 어떻게 설정하나요? threading.Thread로 만들때는 argument에 daemon=True을 하면, 만들어지는 child thread는 daemon이 였는데, 위 경우는 잘 모르겠네요... 4. concurrent.futures.as_completed(Future Object)는 그 Future Object가 그것의 thread/process를 끝내면 바로 어떤작업을 처리하도록 해놓는것이고, thread/process가 끝난 시점에서 return값으로 Future Object 가 있다! 라고 이해하면 되나요? 그리고 그 return값을 갖고 무엇인가를 할때는 parent의 thread/process에서 하는게 맞는것이죠? (그 Future Object가 갖고있던 child thread/process가 아니라) 5. (4번이어서) 그러면 4번의 경우는 child thread/process에서 어떤작업들을 다하고, 그것의 결과를 가지고, parent thread/process에서 추가적인 작업을 할때 사용을 하면 되나요? 6. multi-process를 할때, 그 process의 개수는 제한이 없나요? (제 컴퓨터가 4Cores, 8Logical processors라 하더라도 process는 8개가 최대고 이런것은 없는것이죠??? 마치 task manager의 performance를 보면 Processes가 엄청많이 돌고있는것처럼, 제가 multi-process를 한다는것은 Processes를 그만큼 늘린다는것이고, 그것들을 어떻게 잘 할지는 8개의 Logical processors를 갖고 운영체제가 알아서 할일이라고 이해하면 되겠죠?) ※ multiprocessing을 하실때, 여러 process들을 다 만들어 start를 시키시고, parent process에서 .join()을 하시던데... 관련 2가지 질문이 있습니다. (아래 7번/8번) 7. process A/B/C를 만들어 start를 시키면 parent/A/B/C가 parallel하게 실행이 될텐데, 결국에 (강의에서는 for문을 이용) 순차적으로 parent에서 A.join() > B.join() > C.join()이 되도록 하면 parallel이 더이상 유지되지 않는것 아닌가요? 즉... A.join()을 만나는순간 모든 process는 멈추고 A process만 진행되다가 그것이 끝나면 다시 parent/B/C가 parallel하게 진행되고, 곧 B.join()을 만나는순간 모든 process는 멈추고 B process만 진행되다가 그것이 끝나면 다시 parent/C가 parallel하게 진행되고, 곧 C.join()을 만나면 모든 process는 멈추고 C process만 진행되다가 그것이 끝나면 다시 parent가 진행되고... 이 순서가 아닌가요? 그러면 multi-process의 parallel이, join을 만나는순간 깨지는 개념이 아닌가요? 8. (만일5의 제 의견이 맞다면) multi process에서 main process가 끝나더라도, 다른 child process는 계속해서 진행을 할텐데 (daemon이 아니라면), 굳이 join()을 써서 parallelism을 깨는 이유가 있나요? thread에서는 잘 안쓰던 join인데, process에서는 join을 너무 당연하게 쓰셔서, 제가 놓치거나 모르는부분이 있나 싶어 여쭤봅니다. 9. multi-process의 변수 공유 관련하여 @ multiprocessing(4)-Sharing state 강의, 예시를 들어주신것이 parent process에서 share_value가 0이 나오고 '공유가 안되고있다' 라고 해주셨습니다. (강의 8분4초정도) 그리고 이어서 share_value를 다른 method에 (with 다른 process) 넘겼음에도 불구하고, share_value는 0이라고 해주셨습니다. 따라서 프로세스간 주소공간은 독립적이라고 해주셨는데... (프로세스간 object 공유가 안된다) 그런데 제 짧은 지식으로는, 이번경우는 mulit-process라서 공유가 안되었다기 보다는, 함수의 local변수와 그밖에서의 변수의 name space 때문이 아닌가요? 예를들면 아래코드 (single process) 에서도 share_value는 generate_update_number라는 함수를 다녀오더라도 0입니다. 그 이유는 share_value라는 object가 generate_update_number라는 함수안에서 한것은, return이 따로없다면, 그 밖에서는 영향이 없다! (제 짧은 지식으로는) 때문으로 이해가되는데... 혹시 아닐까요? (아래에 그대로 copy and paste 할 수 있도록 코드를 만들고, 실행결과도 붙였습니다.) ㅡㅡㅡㅡㅡㅡㅡ 코드 ㅡㅡㅡㅡㅡㅡㅡ def generate_update_number(v): print(f"[step2] v의 값 / id : {v} / {id(v)}") for _ in range(50): v +=1 print(f"[step3] v의 값 / id : {v} / {id(v)}") def main(): share_value = 0 print(f"[step1] share_value의 값 / id : {share_value} / {id(share_value)}") generate_update_number(share_value) print(f"[step4] share_value의 값 / id : {share_value} / {id(share_value)}") if __name__=='__main__': main() ㅡㅡㅡㅡㅡㅡㅡ 실행결과 ㅡㅡㅡㅡㅡ [step1] share_value의 값 / id : 0 / 140737278943616 [step2] v의 값 / id : 0 / 140737278943616 [step3] v의 값 / id : 50 / 140737278945216 [step4] share_value의 값 / id : 0 / 140737278943616
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
강의 - 섹션1. Multithreading 질문
안녕하세요, 강사님. 우선 다시한번 좋은강의에 감사드립니다. 섹션1을 다 듣고나서, 정리를 하고 궁금한 부분들을 한번에 질문드립니다. 제가 컴퓨터쪽 전공이 아니라서 용어나 잘 모르는 부분이 많아 질문이 깔끔하지 않은점 이해 부탁드립니다. 미리 답변에 감사드립니다. 1. threading.Lock()이 어느한쓰레드에서 acquire()되는 순간, 그 프로세스 내 모든 thread들은 그 threading.Lock()이 release() 될때까지 작동을 못한다고 이해하면 되나요? 2. (강사님 이전강의를 안들어서 with문이 익숙하지 않네요ㅠㅠ 구글링을 최대한 해보며 이해하려고 노력해봤는데...) with문 안에서는 그 with문 안에 있는 모든 thread 작업들이 끝나야지 with문을 나온다고 보면 되나요? 3. producer and consumer 개념에서, Queue에 아직 무엇인가가 남아있다면, consumer는 그걸 다 처리할때까지 기다리나요? 아니면 Queue에는 무엇인가가 남아있더라도 consumer를 종료하면 그대로 끝나버리나요? (사실 후자가 맞을것 같은데... Queue에 남아있는 상태에서 consumer가 종료되는 코드를 스스로 좀 구현해보려고 했는데 잘안되네요) 4. concurrent.futures.ThreadPoolExecutor로 submit()을 한 결과에 result()를 확인하고자하면, 그 thread의 계산이 끝나서 result()에 값(return)이 들어올때까지 기다리는것 같은데 맞나요? (즉... thread1실행시 그 위에서 thread2를 실행하는 중인데, thread2의 result()를 보고자하면 thread2가 끝날때까지 thread1이 더이상 진행되지 않는것이 맞나요?) 5. 4번과 비슷하게, map은 단순히 submit 여러개를 편하게 해주는것 같은데... map의 결과(generator)를 list()로 감싸고 프린트하려고 하면 똑같이 그 thread가 끝날때까지 기다리나요? 6. 어떤 공유변수를 동기화하면서 가야한다면 멀티스레드/멀티프로세스가 성능의 측면에서는 이득이 없는것이 맞나요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
DaemonThread 문의
안녕하세요. 우선 좋은강의 감사드립니다. Multithreading - Thread(2)의 DaemonThread 관련, 제가 이해하기로는 parent thread가 끝나면, child thread도 바로 끝나버리는, 이 child thread를 DaemonThread로 이해했습니다. 그런데 코드를 아래처럼 작성하면, parent thread가 끝나도 (main thread all done 프린트됨), child thread가 살아있습니다. 왜그런건가요??? 제가 editor로 비주얼스튜디오가아니라 주피터를 쓰고있는데... 혹시 이것때문일까요??? 미리 답변 감사드립니다. [실행코드@주피터 셀] import threading def thread_func(d): for i in d: print(i) if __name__ == '__main__': x = threading.Thread(target=thread_func, args=(range(10),), daemon=True) x.start() print('main thread all done') [출력] 0 1 2 3 4 5 6 main thread all done7 8 9
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
Thread(4) - Lock, Deadlock 강의를 듣다가 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. Thread(4) - Lock, Deadlock 강의를 듣다가 궁금한 점이 생겨서요. 파이썬은 GIL로 한번에 한 스레드만 실행되도록 하고, 제가 멀티스레드를 생성해도 결국 한 스레드만 실행되게 한다고 배웠습니다. 그런데 보여주신 아래 예제에서는 값이 제대로 반영안되는 걸 보여주셨는데요.. local_copy = self.value local_copy += 1 time.sleep(0.1) self.value = local_copy 어차피 GIL때문에 락이 잠겨서 한번에 한 스레드밖에 실행되지 않는데, 이게 값이 왜 제대로 반영안되는건지 궁금합니다. 여러 스레드들은 내부적으로 큐로 관리되고, 한 스레드가 제대로 끝나기 전에는 다른 스레드는 실행되지 않을테니 저 부분이 실행되고 나서야 다른 스레드가 접근할텐데요.. GIL자체가 공유자원에 대한 thread safe하지 않기때문에 그걸 보장하기 위해 인터프리터를 잠가버리는거라고 이해했는데 제 이해가 틀린걸까요 ㅠ GIL이 reference count를 thread safe하게 유지시키기 위해 필요하다고 알고있는데, GIL이 있음으로써 보호해주는건 reference count 하나뿐일까요? GIL이 있음에도 불구하고 멀티스레딩을 thread safe하게 구현할 때는 개발자가 lock을 매번 걸어줘야하는걸까요?
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
Thread(5) - Prod and Cons Using Queue 강의중 궁금한게 생겼습니다
안녕하세요..강사님 패스트캠퍼스에서 부터 강의 잘 듣고 있습니다. 클래스 안에서의 동작이 잘 되질 않네요.. class main(): # 생산자 def producer(self,queue, event): """네트워크 대기 상태라 가정(서버)""" while not event.is_set(): message = random.randint(1, 11) logging.info("Producer got message: %s", message) queue.put(message) logging.info("Producer received event. Exiting") # 소비자 def consumer(self,queue, event): """응답 받고 소비하는 것으로 가정 or DB 저장""" while not event.is_set() or not queue.empty(): message = queue.get() logging.info( "Consumer storing message: %s (size=%d)", message, queue.qsize() ) logging.info("Consumer received event. Exiting") if __name__ == "__main__": # Logging format 설정 format = "%(asctime)s: %(message)s" logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S") # 사이즈 중요 pipeline = queue.Queue(maxsize=10) # 이벤트 플래그 초기 값 0 event = threading.Event() # With Context 시작 with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: executor.submit(main.producer, pipeline, event) executor.submit(main.consumer, pipeline, event) # 실행 시간 조정 time.sleep(0.1) logging.info("Main: about to set event") # 프로그램 종료 event.set()
- 미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
안녕하세요 질문이 있습니다
이전에도 vscode를 사용하긴 했는데 가상환경폴더를 open한후에 python select interpreter를 연결하려고하면 command.execlnterminal-icon not 오류가 뜨면서 진행이 안되네요 그리고 가상환경 폴더안에서는 파일생성이 유난히 느리고요 가상환경이 아닌 그냥 일반폴더에서는 아무 이상없이 오류도 안뜨고 실행이 잘됩니다 왜이런걸까요?