묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
수업질문
안녕하세요 수업을 듣고있는 한 사람입니다 ㅎㅎ 너무 잘 듣고있습니다.수업을 들으면서 궁금한점은 검색과 chat gpt 를 통해서 찾아보고있는데요. 단순 chat gpt 의 결과이지만 코루틴은 주로 I/O 바운드와 고수준 구조화된 네트워크 코드에 사용되며, CPU 바운드 작업에는 적합하지 않을 수 있습니다. CPU 바운드 작업을 비동기적으로 처리하려면 멀티 프로세싱이나 다른 접근 방법을 고려해야 할 수 있습니다. 라고 하더라구요 .혹시 여기에 대해서는 어떻게 생각하시나요 ?
-
해결됨앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해
[7-3.DispatchBarrier] 예제 코드 질문
아래 예제 코드에서 "threadSafeNameGroup.notify" 가 정상적으로 동작하려면, 그룹의 enter와 leave 를 사용해주어야 하는 것이 아닌가? 라는 생각이 들었습니다.왜냐하면 "barrierThreadSafePerson.changeName" 메소드가 async로 작업을 보내기 때문입니다. 그럼에도 정상적으로 동작하는 이유는 barrier 플래그를 설정했기 때문에, 현재 쓰레드를 블락처리 했기 때문에 정상적으로 동작했는 것이 아닌가하는 추측을 하고 있습니다. 왜 enter 와 leave가 사용이 되지 않았는지 궁금합니다.
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
강의 자료가 강의와 불일치 한 것 같습니다.
강의 자료를 받고 있는데 스프링 시큐리티 강의 자료가 받아집니다. 확인 부탁드리겠습니다.
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
ThreadPoolExecutor에서 작업중인 쓰레드가 있을때 대기할수 있는 방법이 있는지요?
안녕하세요.정말 알찬 강의라 멀티프로세싱 스터디에 정말 좋은 교재가 되고 있습니다. 감사드리구요ThreadPoolExecutor를 사용하여 코딩하는데 질문이 있습니다.현재 저는 주식자동화 매매 관련 코딩 스터디 중인데요. ThreadPoolExecutor를 이용하여 주식주문이 동시에 체결되었을때의 병렬처리에 대하여 스터디 하고 있습니다.. 각기 다른 종목이 동시에 주문체결이 되었다면각각의 종목에 대한 후속처리를 동시성을 적용하여 각각 다른 쓰레드를 할당하여 병렬처리를 하면 되지만. 같은 종목이 약간의 시간차(?) 거의 동시에 연속적인 체결이 된다면 이때는 병렬처리가 아닌 앞 주문에 할당된쓰레드가 종료될때 까지 대기하고 있다가(후속작업이 꼬이지 않도록) 뒤에 체결된 주문을 처리하도록 쓰레드를 할당하는 동기적인 처리가 필요한 경우가 있습니다.이런 경우를 처리하기 위한 별도의 메서드가 있는지요? . 아니면 별도의 코딩을 해야한다면 어떤 방식으로코딩을 해야 하는지 문의드립니다. 감사합니다
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
중첩 스레드는 실무에서 어떤 경우에 사용하나요?
중첩 스레드는 어떤 경우에 사용하는지 궁금합니다.그동안 래핑된 스레드 클래스를 써와서 그런건지는 모르겠는데,,,
-
미해결자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
병렬성은 동시성의 하위 개념에 대한 질문
병렬성과 동시성은 동시에 실행된다는 내용만 같고 구체적인 처리 방식은 달라보이는데 '병렬성은 동시성의 하위 개념'이다 라는 내용이 이해가 안갑니다.만약 동시성이 여러 일이나 사건이 동시에 발생하거나 진행되는 상태를 말한 개념을 말한거라면 '병렬성은 동시성의 하위 개념'이다 라는 내용이 이해가 가는데강사님께서 설명한 특정한 순서 없이 겹치는 기간에 시작, 실행 및 완료 되는 여러 작업에 관한 동시성에 대한 개념으로 '병렬성은 동시성의 하위 개념'이다 라는 내용을 이해해볼려 하면 이해가 안되는 것같습니다.만약 해당 동시성이 후자라면 어떻게 '병렬성은 동시성의 하위 개념'이 되는지 궁금합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
stringRedisTemplate 사용시 이슈 파악
StockRepository 가 아닌 stringRedisTemplate 을 사용하면 어떤 차이점이 있을까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
비관적 락 적용을 해도 동시성 테스트 시 실패합니다...
StockRepositorypublic interface StockRepository extends JpaRepository<Stock, Long> { @Lock(value = LockModeType.PESSIMISTIC_WRITE) @Query("select s from Stock s where s.id = :id") Stock findByIdWithPessimisticLock(@Param("id") Long id); }StockService@Service @RequiredArgsConstructor public class StockService { private final StockRepository stockRepository; @Transactional public Long decrease(Long id, Long quantity) { Stock stock = stockRepository.findByIdWithPessimisticLock(id); stock.decrease(quantity); stockRepository.saveAndFlush(stock); return stock.getQuantity(); } }StockServiceTest@SpringBootTest class PessimisticLockStockServiceTest { @Autowired private StockService service; @Autowired private StockRepository stockRepository; @BeforeEach public void before() { stockRepository.saveAndFlush(new Stock(1L, 100L)); } @AfterEach public void after() { stockRepository.deleteAll(); } @Test @DisplayName("비관적 락을 사용해 재고 감소 동시성 요청이 완료된다.") void decrease() throws InterruptedException { // given int threadCnt = 100; ExecutorService executorService = Executors.newFixedThreadPool(32); CountDownLatch latch = new CountDownLatch(threadCnt); // when for (int i = 0; i < threadCnt; i++) { executorService.submit(() -> { try { service.decrease(1L, 1L); } finally { latch.countDown(); } }); } latch.await(); // then Stock stock = stockRepository.findById(1L).orElseThrow(); assertThat(stock.getQuantity()).isZero(); } }해당 테스트를 돌리면 실패하고 순차적으로 재고가 감소되지 않고 수정 손실이 발생합니다. 아무리 찾아봐도 코드는 제대로 짠 것 같은데 무엇이 잘못 되었을까요??
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
Redisson - 100개의 스레드가 동시에 tryLock을 호출하나요?
[Redisson을 활용하여 재고로직 작성하기] 강의 수강 후 궁금한 점이 있어 질문드립니다.100개의 스레드가 동시에 재고 감소를 시도하면, 모든 스레드가 동시에 trylock으로 락 획득을 요청하는 건가요? 그렇다면 waitTime이 15초 leaseTime이 1초인 경우, 16번째 스레드부턴 락을 획득할 수 없을 거라고 예상했는데 테스트는 통과하여 질문드립니다.stockService.decrease 작업이 1초보다 덜 걸려서 이게 가능한 건가요?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
response 객체에서 키값으로 조회 시 KeyError 발생
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요,강의 2:17 부분을 보면서 따라해보고 있는데 아래 부분에서 KeyError가 발생합니다.items = result["items"] 구체적인 에러 메시지는 다음과 같습니다result 객체의 키값만 조회해보면 items가 정상적으로 존재하고, reult의 타입도 dict 형태로 나오는데 왜 keyerror가 발생하는걸까요..?
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
py_ad_2_5_2 Sharing State의 Argument 부분
Sharing State의 두번째 예제 Value 객체를 다루는 부분에서 generate_update_number 함수에서 전달 받는 인자가 첫번째 예제와 같이 v: int라 명시되어 있습니다.하지만 함수 내부에선 v는 Value 객체로 활용되는데, 여전히 잘 동작하는 이유는 파이썬이 자동적으로 캐스팅 해주기 때문인가요? 아니면 다른 이유가 있는건가요?그리고 만약 교정이 필요하다면 함수 인자 Type Hint 표기 시 어떻게 해주어야 할까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
MySQL named lock과 redis를 사용한 분산락 구현의 차이점
안녕하세요 강사님, 유익한 강의 잘 듣고 있습니다. 😀강의를 듣던 중 분산락을 구현하는 더 좋은 방법이 무엇일지 궁금해서 질문 남깁니다.강의 중에선 MySQL named lock이 트랜잭션 종료 시 수동으로 락을 반환해야한다는 점 때문에 관리가 어렵다는 단점이 있다고 언급하셨는데요, 레디스를 사용했을 때와 비교해서 named lock이 분산락을 구현하는데 있어 더 불리한 점이 있나요? 구글링을 좀 해봤는데 네임드락은 클러스터 환경에서 분산 락 제공이 불가능하고, 추가로 zookeeper 같은 분산락 관리자를 사용해야한다고 하는데.. 잘 이해가 안되어서 여쭤봅니다. 오히려 기존에 MySQL을 사용하고 있다면 네임드락을 사용하는게 레디스 추가 비용 없이 분산 락을 구현할 수 있는 방법이라는 생각이 드는데요, 강사님은 어떻게 생각하시는지 궁금합니다. 참고로 제가 읽었던 분산락 관련 블로그 주소입니다. https://velog.io/@this-is-spear/MySQL-Named-Lock
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
@Transactional과 synchronized를 같이 써도 동시성 테스트가 통과 돼요
강의 보면 통과가 안되는데 저는 테스트 코드를 돌려보면 통과하게 됩니다. 왜그런건가요??
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
강의보고 토이프로젝트로 재고감소 낙관적락 기법 적용 질문
안녕하세요 강사님 강의를 보고 토이 프로젝트에서 주문 시 재고 감소 및 메뉴 주문량 증가 로직에서 낙관적락 기법을 적용해 보았는데요, 강의에서 해주신 내용 그대로 파사드 패턴 까지 적용을 해보면서 시도했는데 무한 루프가 돌았습니다.hikariCP pool을 40으로 설정해주니 그제서야 해결이 되었는데요, 강의에선 네임드락에서 커넥션풀을 지정해주었는데요 저는 낙관적락인데도 해당 설정을 해서 해결된 이유가 있을까요?@Service @RequiredArgsConstructor public class OrderService { @Transactional public Order orderWithOptimisticLock(Long memberId, LocalDateTime now) { Cart cart = cartRepository.findByMember(memberId); List<CartItem> cartItems = cart.getCartItems(); cartItems.stream() .map(CartItem::getMenu) .forEach(menu -> { decreaseStockWithOptimisticLock(menu.getId(), 1); increaseMenuOrderCountWithOptimisticLock(menu.getId(), 1); }); Money money = calculator.calculateMenus(cart.getMember(), cart.convertToMenus()); Order order = Order.createOrder(cart, money, now); return orderRepository.save(order); } public void decreaseStockWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.decrease(quantity); } public void increaseMenuOrderCountWithOptimisticLock(Long menuId, int quantity) { Menu menu = menuRepository.findByIdForOptimisticLock(menuId); menu.increaseOrderCount(quantity); } } ``` @Component @RequiredArgsConstructor public class OptimisticLockStockFacade { private final OrderService orderService; public Order order(Long memberId, LocalDateTime localDateTime) throws InterruptedException { while (true) { try { return orderService.orderWithOptimisticLock(memberId, localDateTime); } catch (Exception e) { Thread.sleep(50); } } } } ``` public interface JpaMenuRepository extends JpaRepository<Menu, Long> { @NotNull @Lock(LockModeType.OPTIMISTIC) @Query("select m from Menu m where m.id = :id") Optional<Menu> findByIdForOptimisticLock(@NotNull @Param("id") Long id); }
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
레디슨 락 대기 질문
레디슨과 레튜가 락 대기 관련해서 질문드립니다.레튜스는 스핀락 방식으로 쓰레드를 계속 사용해서 부하를 주는 것으로 배웠습니다. 그에 반해 레디슨을 사용하면 쓰레드 대기를 한다고 하셨는데, 쓰레드가 대기 되면, 해당 쓰레드는 스핀락과 다르게 아무것도 하지 않아서 부하를 주지 않는 것인가요? 그렇다면 스핀락과 크게 차이가 없다는 생각이 들었습니다.아니면 대기 중에 다른 작업을 하는 것이라 유용한것인가요?
-
미해결고수가 되는 파이썬 : 동시성과 병렬성 문법 배우기 Feat. 멀티스레딩 vs 멀티프로세싱 (Inflearn Original)
Thread(4) 16:10 스레드 질문
안녕하세요,강의의 해당 부분에서 스택, 데이터 힙 영역에 대해서 설명해주셨는데 이해가 어려워서 질문남깁니다.Init함수는 스택 영역이고 그 안에서 데이터나 heap영역으로 self.value 변수를 공유한다. 이렇게 이해하면 될까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
분산락에 대해서 질문이 있습니다.
해당 질문에 대한 답변을 보고 혼동이 되어서 질문드립니다.분산 락의 완전한 정의를 찾을 수가 없어서 다음 두 상황이 혼동되는 것 같습니다. 1. 웹 애플리케이션 서버가 여러대인 경우, 이들간의 동시성 문제를 해결하기 위해 사용되는 Lock2. 스케일 아웃된 DB 환경에서 동시성 문제를 해결하기 위해 사용되는 Lock jeoningu님의 질문과 이에 대한 답변에 따르면, 1번 상황은 분산락이 아니며(낙관적 락, 비관적 락은 분산락이 아닌 것처럼 설명해 주셨으므로), 2번 상황이 분산락인 것 처럼 되는 것 같습니다. 그런데 이런저런 자료를 찾아보다보니, 1번 상황 역시도 분산 락의 개념에 포함되는 것 같습니다.(즉 낙관적 락과 비관적 락도 분산 락에 포함됨) 그래서 제 스스로 다음과 같은 결론을 내렸는데, 이게 올바른 것인지를 확인할 방법이 없어서 선생님께 조언을 구하고 싶어 질문 드립니다."1번과 2번 모두 분산락의 개념이다.낙관적 락과 비관적 락은 다중 애플리케이션의 동시성을 제어할 수 있는 분산 락을 구현할 수 있는 방법 중 하나이다.그러나 여러대의 DB를 사용하는 경우 이들로는 분산락을 구현할 수 없게 된다.이러한 경우 레디스와 같은 Lock 을 위한 DB를 하나 두어 이를 통해 분산락을 구현하여 사용해야 한다."잘못 이해한 부분이 있다면 지적해주시면 감사하겠습니다..!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
named lock vs 비관적 락
좋은 강의 너무 감사합니다.강의를 보며 궁금한 점이 생겨서 질문 드립니다. named lock을 통해 동시성 문제를 해결하는 예시를 보았을 때, 비관적 락과 무엇이 다른 것인지 큰 차이를 느끼지 못했습니다.named lock이 비관적 락에 비해 가지는 장단점에 비해 찾아보니, timeout 설정이 좀 더 간편하다는 내용 말고는 유의미한 차이를 찾지 못했습니다.(그러나 비관적 락 + queryhint 를 사용하면 비관적 락 사용 시에도 딱히 어려움 없이 timeout을 설정할 수 있었습니다.) 혹시 named lock이 비관적 락에 비해 지니는 장단점과, 어떤 경우에 비관적 락 대신 Named lock을 통해 분산락을 구현하시는지 궁금하여 질문드립니다.
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
OptimisticFacade, LettuceLockStockFacade 에 대해 @Transactional 질문
강의 잘 듣고 있습니다.다름이 아니라 OptimisticFacade 클래스의 decrease 메서드는 트랜잭션을 붙히지 않으셨는데 이는 optimisticLockStockService.decrease가 실질적인 DB 와 통신하는 부분이기 때문에 optimisticLockStockService.decrease에서만 @Transactional을 적용시켜야 하기 때문인것인가요?? 또한, LettuceLockStockFacade의 경우 redisLockRepository에 접근하는 부분이 있는데, 레디스에 접근시에는 트랜잭션을 걸어주지 않아도 될까요?또한, 제가 알기로는 @Query를 사용하는 경우 @Transactional이 적용되지 않는다고 알고 있는데, 그렇다면 Pessimistic과 Optimistic 의 decrease 메서드의 경우 @Transactional이 없어도 괜찮은것 일까요?
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
트랜잭션 전파속성, 데이터 소스
안녕하세요. 강의 잘 보고 있습니다. 의문이 생겨 질문을 남깁니다. 트랜잭션 전파속성을 REQUIRES_NEW로 해서 새로 생성한 이유가 있을까요? 그냥 REQUIRED로 하면 안되나요??강의 내에서 데이터소스를 분리하는 것을 추천해주셨는데, 커넥션 풀 사이즈를 늘리면 안되나요?? 감사합니다.