묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비트코인 알고리즘 트레이딩 봇 개발
강의 1차완강 다하긴 했습니다.
보통 자동화툴을 만들다보면 UI를 통해서 만들던데 파이썬을 이용한 ui의 대표적인 방식은 pyqt와 같은 데스크탑 어플리케이션 django와 같은 웹 어플리케이션 두가지 방식이 있는거같은데 강사님은 어떤 방식이 더 자동화만드는데 좋을거같은지요
-
미해결실전! 스프링 데이터 JPA
@Transaction 전파 관련 문의
안녕하세요 김영한 팀장님! 실습한 MemberRepository의 구현체로 SimpleJpaRepository가 생성되며, 내부의 findById 메서드가 @Transactional(readOnly)이 적용되어 있고 기본 설정이 "Propagation.REQUIRED"이기 때문에 부르는 쪽의 Transaction이 전파되는 것으로 이해했습니다. @Transactional@GetMapping("/tx/{id}")public void findMember3(@PathVariable("id") Long id) { Member member1 = memberRepository.findById(id).get(); Member member2 = capsule(id); System.out.println(member1); System.out.println(member2);}@Transactional(propagation = Propagation.REQUIRES_NEW)public Member capsule(Long id) { return memberRepository.findById(id).get();} 하지만 다음과 같이 컨트롤러 메서드 "findMember3"에 @Transactional을 걸고, memberRepository의 findById를 수정할 수 없으므로 capsule 메서드로 감싸서 member를 조회해봤는데요. propagation을 new로 설정했음에도 출력 결과가 같은 인스턴스를 가리키는 것으로 나왔습니다.select query도 하나만 발생했는데, 이 경우에도 같은 영속성 컨텍스트를 공유하게 되는 건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
타입이 겹칠 수 있다면 어떤 식으로 해결하는 게 좋을까요?
타입이 중복으로 소유된다면 어떻게 해야될까요? ex) 아래와 같은 논리모델을 가진 테이블이 있습니다. (이번 수업의 예제로 사용된 테이블구조입니다.) '해리포터 책 세트 및 영화소장권'이라는 ITEM이 있고,해당 ITEM은 BOOK의 속성과 MOVIE의 속성을 모두 가지고 있습니다.혹시 이런 경우에도 설계로 풀어낼 수 있는 방법이 있을까요? 가장 궁금한 건 객체를 어떻게 풀어내느냐입니다!MOVIE와 BOOK을 모두 포함하는 서브타입 엔티티가 추가되는 것은 불가피하다고 생각합니다.이 MOVIE_BOOK을 class로 풀어낼 때 MOVIE와 BOOK이 가지는 속성과 메서드를 그대로 가지게 될텐데, 객체설계를 어떻게 하는 게 좋을까요?MOVIE와 BOOK을 모두 MOVIE_BOOK에서 상속받을 수는 없고, interface로 풀어보려고도 해봤지만 interface에는 멤버변수 선언이 불가능하여 포기했습니다... 해당 부분과 관련하여 좋은 방법이나 글이 있다면 알려주시면 감사하겠습니다.(정 안 되면 MOVIE_BOOK은 MOVIE_BOOK대로, MOVIE는 MOVIE대로 BOOK은 BOOK대로 만드는 방식으로 갈 예정입니다.) (전략은 JOIN과 SINGLETABLE 모두 상관없습니다.)
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
conda 설치 이후 startproject 누락인가요?
안녕하세요 django 를 배워보고 싶어 강의 수강중인 개발자 입니다. 다름이 아니라 이전 강의에서 conda 설치 이후 project 생성 부분이 생략 된게 아닌가 싶네요 . conda 환경 세팅 이후 vscode 설치하여 project폴더 설명으로 바로 들어가는데 그 전에 django-admin startproject <projectname> 으로 프로젝트를 생성 한뒤 진행이 되야 할거 같은데 이 부분이 생략 되어 잠시 혼돈이 왔었네요. 추가 설명이 있으면 좋을거 같습니다.
-
미해결
lab7 과제에 대한 답
안녕하세요 해당 과제를 며칠동안 고민하면서 작성해보고 있습니다. 실력의 한계로 인해 궁금한 부분이 너무 많아 각각 다 질문하는 것이 힘든데 lab 7에 대한 답을 메일로 받을 수 있는지 문의드립니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Mybatis, JPA 혼용사용
안녕하세요 강의 잘 듣고 있습니다. 다름이 아니라, 기존 진행하던 프로젝트가 Spring, Mybatis를 사용하고 있어, JPA를 추가하여 혼용 사용하려고 합니다. 하나의 DB를 바라보게 하기 위해서 Datasource를 나눠서 생성하고, trancsaction을 Mybatis용 JPA용으로 나눠서 생성하였고, ChainedTransactionManager를 사용하여 트랜잭션을 묶어줬습니다. 하지만 계속 다음과 같은 에러가 발생하고 있습니다. [o.s.d.r.c.RepositoryConfigurationDelegate] - Multiple Spring Data modules found, entering strict repository configuration mode! 이런 문제가 발생했을때 어떻게 처리해야할까요 ㅜㅜㅜ 도움이 필요합니다. config.xml 파일입니다.. <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:mybatis/jdbc.properties</value> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxWait" value="3000" /> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="50" /> <!-- connection - validation query --> <property name="validationQuery" value="select 1"/> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="7200000" /> </bean> <bean id="jpadataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxWait" value="3000" /> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="50" /> <!-- connection - validation query --> <property name="validationQuery" value="select 1"/> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="7200000" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" /> </bean> <bean id="transactionManager" class="org.springframework.data.transaction.ChainedTransactionManager"> <constructor-arg> <list> <ref bean="mybatisTransactionManager"/> <ref bean="jpaTransactionManager"/> </list> </constructor-arg> </bean> <bean id="mybatisTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="jpaEntityManagerFactory" /> </bean> <bean id="jpaEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="jpadataSource"></property> </bean> <tx:annotation-driven /> <aop:config proxy-target-class="true"> <aop:pointcut id="serviceOperation" expression="execution(* com.xii..*Service.*(..))" /> <aop:advisor id="transactionAdvisor" pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="delete*" rollback-for="Exception"/> </tx:attributes> </tx:advice> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xii" /> </bean> <jpa:repositories base-package="com.xii"/> </beans>
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
generator 예제 2번 질문입니다
def generator_ex1(): print('Start') yield 'A point' print('Continue') yield 'B point' print('End') 다음과 같이 코드 작성 후 temp2 = [x * 3 for x in generator_ex1()] 리스트 컴프리헨션을 실행하니 Start Continue End 라는 결과가 나왔습니다. 리스트 컴프리헨션 안의 generator_ex1()을 실행하면서 나온 결과라고 생각하는데요, 반면 위의 리스트 컴프리헨션을 지운 후 temp3 = (x * 3 for x in generator_ex1()) 다음과 같이 제너레이터 익스프레션 실행을 하여도 아무런 결과값이 나오지 않았습니다. 표현식 안의 generator_ex1()이 실행되지 않은 것으로 보이는데, 두 과정 사이에 어떤 차이가 있는 것인지 궁금합니다
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
모달창 관련 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. vue transition을 활용하여 강사님 강의 내용과 동일하게 Modal을 적용하였습니다. 그런데 modal창이 처음 등장할 때 애니메이션 효과는 적용되지 않네요. 강사님 코드는 다른가해서 클론받아 확인해봤는데, 마찬가지로 모달창이 처음 등장했을 때 애니메이션은 적용되지 않은상태입니다. 이 부분 관련해서 확인해주실수 있으실까요?
-
미해결풀스택을 위한 탄탄한 프런트엔드 부트캠프 (HTML, CSS, 바닐라 자바스크립트 + ES6) [풀스택 Part2]
slide-prev,slide-next
안녕하세요! 질문이 있습니다. arrow-container라는 클래스로도 아이콘 화살표 디자인을 충분히 할 수 있을거 같은데 굳이 slide-prev, slide-next 두가지 새로운 클래스를 만들어서 적용하신 이유가 궁금합니다
-
미해결[비전공자 대환영] 제로베이스도 쉽게 입문하는 파이썬 데이터 분석 - 캐글입문기
레몬에이드 데이터 자료에 없습니다
데이터자료 어디서 다운받아야 하나요 강의자료에서 볼수 없던데요
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
UnicodeDecodeError: 'cp949' codec can't decode byte 0x94
--------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) <ipython-input-47-9f2a70a6b775> in <module> 2 ## %ls 3 ----> 4 df_last = pd.read_csv(r"D:\인공지능\파이썬교육\data\주택도시보증공사_전국 평균 분양가격(2019년 12월).csv", encoding="cp949") 5 ## df_last.shape C:\Windows\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision) 674 ) 675 --> 676 return _read(filepath_or_buffer, kwds) 677 678 parser_f.__name__ = name C:\Windows\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds) 446 447 # Create the parser. --> 448 parser = TextFileReader(fp_or_buf, **kwds) 449 450 if chunksize or iterator: C:\Windows\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds) 878 self.options["has_index_names"] = kwds["has_index_names"] 879 --> 880 self._make_engine(self.engine) 881 882 def close(self): C:\Windows\Anaconda3\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine) 1112 def _make_engine(self, engine="c"): 1113 if engine == "c": -> 1114 self._engine = CParserWrapper(self.f, **self.options) 1115 else: 1116 if engine == "python": C:\Windows\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds) 1889 kwds["usecols"] = self.usecols 1890 -> 1891 self._reader = parsers.TextReader(src, **kwds) 1892 self.unnamed_cols = self._reader.unnamed_cols 1893 pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.__cinit__() pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._get_header() pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._tokenize_rows() pandas\_libs\parsers.pyx in pandas._libs.parsers.raise_parser_error() UnicodeDecodeError: 'cp949' codec can't decode byte 0x94 in position 23: illegal multibyte sequence
-
미해결Vue-Django-Bootstrap 뚝딱 블로그
궁금한게있어 질문드립니다!
post_list_vue.html 코드에서 fetchPostList()메서드를 주석처리하셨는데 prevPage(), nextPage() 메서드에 fetchPostList()에 curPage를 넣어줫는데도 정상작동하나요? 그리고 태그,카테고리를 눌렀을때 fetchPostList()메서드가 주석처리되어있는데 왜 url이 잘 이동되는것인가요? created()에서 fetchPostList메서드를 주석처리하였는데 fetchPostList메서드 안에있는 geturl이 어떻게 작동하는지 궁금합니다! created()에 주석처리를하더라도 fetchPostList()함수는 그대로 살아있는건가요?
-
미해결AI 포트폴리오 만들기 - Airbnb 클론 프로젝트
YOLO 대신 CenterNet을 선택하신 이유가 궁금합니다.
안녕하세요. 강사님. 강의 잘 보고 있습니다. CenterNet에 대한 설명을 듣던 중 한 가지 의문점이 생겨 질문드립니다. YOLO 도 One-Stage model로 빠른 속도를 자랑하고 있는 데, One-Stage Model 에서 특별히 CenterNet을 채택하신 즈된 이유가 궁금합니다. Key-Point나 중복된 anchor prediction 방지를 위해서인지.. YOLO 모델이 이런 부분에선 부족한 것인지.. 의문이 들어서 질문 드립니다. ㅎㅎ 항상 감사드립니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
request body json v5에서 nullpointer
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]requestBodyJsonV5 메서드에서 HelloData data = httpEntity.getBody(); 이렇게 http body에서 객체에 값을 넣는 것까지 하였습니다. 그런데 log.info를 사용하는 부분에서 data.getUsername이 NullPointerException이 나올 수 있다고 warning이 뜹니다. 그래서 Optional.ofNullable(data.getUsername()) 라고 사용해 보았는데 아직도 이 warning이 나옵니다. 그래서 제가 Optional을 잘못 사용한 것인지 어떻게 해야 좋은 방법인지 조언을 구합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
페이징 API를 이용해서 페이징 구현
안녕하세요, 영한님! jpa 페이징 api를 이용해서 간단한 페이징 화면을 구현해 봤는데 잘못된 부분이 있는지 궁금해서 질문드립니다! <memberList.html> <div class="pagination"> <span th:each="pageNum : ${pageList}" th:inline="text"> <a th:href="@{'/members?page=' + ${pageNum}}">[[${pageNum}]] </a> </span></div> 컨트롤러에서 받아온 pageList를 뿌려주고 특정 페이지를 누르면 해당 페이지로 이동하게 만들었습니다. <MemberRepository.java> // 전체 회원 조회public List<Member> findAll(int page) { return em.createQuery("select m from Member m order by m.id desc", Member.class) .setFirstResult((page-1) * 10) .setMaxResults(10) .getResultList();}// 전체 게시물의 개수 (100개)public int boardCount() { return em.createQuery("select m from Member m", Member.class).getResultList().size();} 페이지 별로 10개씩 끊어서 가져오는 메서드와 페이지 수를 구하기 위해 전체 게시물의 개수를 구하는 메서드 2개를 추가했습니다. <MemberService.java> // 페이지 별 회원 조회public List<Member> findMembers(int page) { return memberRepository.findAll(page);}// 페이지의 개수public int[] pageList() { int totalPage = memberRepository.boardCount() / 10; totalPage = ((memberRepository.boardCount() % 10) == 0) ? totalPage : totalPage + 1; int[] pages = new int[totalPage]; for(int i = 0; i < totalPage; i++) { pages[i] = i + 1; } return pages;} findMembers(page) : 페이지에 해당하는 멤버 리스트를 조회 pageList() : 전체 페이지의 개수 리턴 <MemberController.java> @GetMapping("/members")// 처음 리스트를 들어가면 Page 번호는 1번이 디폴트!public String list(Model model, @RequestParam(value = "page", defaultValue = "1") int pageNum) { List<Member> members = memberService.findMembers(pageNum); // 페이지 번호 별 게시물 int[] pages = memberService.pageList(); // 페이지 개수 model.addAttribute("members", members); model.addAttribute("pageList", pages); return "members/memberList";} @RequestParam을 이용해서 처음 /members를 실행한 경우 1번 페이지를 출력하게 만들었고, 페이지 별 멤버리스트와 전체 페이지의 개수를 model에 담아서 화면쪽으로 넘겨서 구현했습니다. 잘못 구현하거나 고칠 부분이 있는 지 궁금합니다..! 아래는 결과화면 입니다!
-
미해결실전! Querydsl
QUERYDSL rank 함수 문의
안녕하세요 강사님 querydsl 에서 rank 함수 사용법 문의드립니다. 개인적으로 검색해본 결과는 SqlQueryFactory를 사용해서 SqlExpression을 쓰면 되던데.. 해당 내용으로 변경해서 querydsl 을 호출하니 엔티티 및 속성 맵핑이 제대로 안되더라구요 예를 들어 엔티티명이 Customer , 실제 테이블명 CUST 일 경우, Customer로 쿼리를 날려 테이블이 존재하지 않는다고 오류가 발생합니다. 어떻게 사용해야할까요? ㅠㅠ 답변 부탁드립니다. 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DispatcherServlet 등록
안녕하십니까 강사님 수업을 듣는 중에 DispatcherServlet이 실행되는 과정을 말씀해주셨는데 제가 이해한 내용이 맞는지 궁금하여 여쭤봅니다. 1. DispatcherServlet의 부모인 FrameworkServlet의 service메서드를 실행하면서 누가 실행시키는 것인지는 모르지만 DispatcherServlet의 doDispatch 메서드가 실행이 되면서 handler를 찾고 adapter를 찾게 된다. 2. DispatcherServlet을 서블릿으로 자동으로 등록하신다고 말씀하셨는데 어떻게 등록하지?라는 궁금점이 생겨 찾아보았습니다. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-servlet-config 에서 ServletInitializer가 결국 WebApplicationInitializer를 구현하는데 이 인터페이스는 'DispatcherServlet 의 위치를 지정하는 메서드를 재정의하여 DispatcherServlet을 등록하는 것을 훨씬 쉽게한다'고 하는데, ServletInitializer에 의해 등록이 되는거로 생각하면 되는건가요??? 3. servelet은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램이라고 알고 있는데 DispatcherServlet을 서블릿으로 자동으로 등록한다는 의미는 DispatcherServlet을 이용하여 웹 페이지를 동적으로 생성한다 라는 말과 같을까요?? 4. 강의에서 클래스 레벨에 @Component만 붙게 된다면 핸들러 매핑을 따로 해줘야한다. 라는 말씀을 하셨을 때는 이해가 되지 않았는데 강의를 들어보니 @Component는 단지 빈으로 등록하는 것이고, 핸들러 조회를 하게 되면 조회가 되지 않는다. 따라서 @RequestMapping을 사용하여 핸들러 매핑을 해줘야 DispatcherServlet이 핸들러를 조회할 때 조회가 된다 라고 이해하면 될까요?? 읽어주셔서 감사합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의자료 깃허브에없는데 html이나이런거어디서 받아야하나요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확 내용이곧제목입니다1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.w2tomwsznga7)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://docs.google.com/document/d/1xCQKit-1V6l6ObeCe49St33RHPzLF_P_c3o7aSDTKs0/edit#heading=h.7dhnp46ven0v)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
parentPort.close() 질문입니다
const {Worker, isMainThread, parentPort} = require('worker_threads');if (isMainThread) { const worker = new Worker(__filename); worker.on('message', (value) => console.log('워커로부터', value)); worker.on('exit', () => console.log('워커 끝')); worker.postMessage('ping');}else { parentPort.on('message', (value) => { console.log('부모로부터', value); parentPort.postMessage('pong'); parentPort.close(); })} 이 코드에서 한개의 워커스레드는 parentPort.close()를 통해서 close가 됬다는것을 mainThread에 알려줘야만 worker의 exit 이벤트 (worker.on('exit'))가 실행되는걸로 이해를 했습니다 왜냐하면 저 코드에서 parentPort.close()만 없애면 프로세스가 끝나지않았기 때문입니다. 이와달리 const {Worker, isMainThread, parentPort, workerData } = require('worker_threads');if (isMainThread) { const threads = new Set(); threads.add(new Worker(__filename, { workerData: { start: 1} })); threads.add(new Worker(__filename, { workerData: { start: 2} })); for (let worker of threads) { worker.on('message', (value) => console.log('워커로부터', value)); worker.on('exit', () => { threads.delete(worker); if (threads.size === 0) { console.log('워커 끝') } }); }}else { parentPort.postMessage(workerData.start + 100);} 워커스레드를 여러개 만들어서 간단히 100을더하는 코드는 parentPort.close()해주지 않았음에도 불구하고 worker의 exit이벤트(worker.on('exit'))를 호출할수 있고 프로세스가 정상적으로 종료가 되는지 궁금합니다 threads Set에서 워커스레드를 지워줬으니까 그런것 같은데 애초에 parentPort.close()해주지 않았는데 exit이벤트로 어떻게 들어가는지가 잘 이해가 안갑니다.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
비바도 구매처
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 맛비님 수업과는 관계된 내용이 아니라 죄송스럽지만 혹시 비바도를 한국에서 구매하셔서 쓰시나요? 회사에 적용하려고 하는데 구매처가 안나와서요.