다중 스레드 파이썬 액세스가 동기화 된 것 같습니다.

속도

10 개의 스레드가 각각 "동시에"파일에 100 줄을 쓰는 작업이 있습니다. 나는 쓰기가 인터리브 될 것이라고 생각했다. 대신 쓰기가 동기화 된 것처럼 보입니다. 나는 GIL을 알고 있지만 기본 OS 호출이 GIL 외부에 있기 때문에 파일 I / O에 적용되지 않았다고 생각합니다.

import threading
import tempfile

with tempfile.NamedTemporaryFile(delete=False) as named_temp:

    temp_filename = named_temp.name
    print(temp_filename)

    with open(temp_filename, mode='a') as writer:

        def thread_task(writer, thread_index):
            for iter_index in range(0, 100):
                writer.write(f'{(iter_index + thread_index * 100):06}')
                writer.write('\n')

        def make_thread(writer, thread_index):
            return threading.Thread(target=lambda: thread_task(writer, thread_index))

        threads = []
        for thread_index in range(0, 10):
            threads.append(make_thread(writer, thread_index))

        for thread in threads:
            thread.start()
        for thread in threads:
            thread.join()

    with open(temp_filename, mode='r+') as reader:
        for line in reader.readlines():
            print(line, end='')

이것이 예상되는 것입니까 아니면 어떻게 든 잘못 설정되어 있습니까? 위의 코드 인터리빙 출력이 걱정됩니다 (줄 순서는 신경 쓰지 않지만 000007000008\n\n. 같은 것을 원하지 않습니다 . 그래서 잠금을 도입 할 계획이지만 그 전에 실패한 테스트를 만들고 싶었습니다. 그렇게하는 데 문제가 있습니다.

관련이 있다면 Python 3.6.8에 있습니다.

또한 "쓰기가 동기화되었습니다"라는 것은 내 출력이 000001\n000002\n...000999\n완벽한 순서 임을 의미 합니다. 적어도 나는 주문 번호 매기기를 기대할 것입니다.

ShadowRanger

문제는 쓰기가 버퍼링되므로 GIL이 실제로 해제되지 않는다는 것입니다 (일반적으로 버퍼가 가득 flush차거나 파일이 명시 적으로 ed 또는 closed 일 때만 발생하는 버퍼가 실제로 기록 될 때만 해제됩니다 ) . 각 스레드가 수행하는 작업은 매우 적기 때문에 시간 초과로 인해 GIL을 해제 할만큼 오래 실행되지 않으며 실제로 디스크에 기록하지 않음으로써 시스템 호출을 차단하기 때문에 해제하지 않습니다.

당신이 그것을 만들 경우 flush각 라인 (또는이 하나의 스레드가 모든 마무리하기 전에 채운다 정도로 작은 버퍼 만들기 write를) 예상대로 인터리빙 볼 수 있습니다. 그렇게하는 한 가지 방법은 다음과 같이 변경하는 것입니다.

with open(temp_filename, mode='a') as writer:

에:

with open(temp_filename, mode='a', buffering=1) as writer:

여기서는 buffering=1라인 버퍼링을 의미합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Outlook 365 클라이언트 동기화 프로세스가 중단 된 것 같습니다.

분류에서Dev

클래스의 C ++ 속성이 다시 초기화 된 것 같습니다.

분류에서Dev

모카로 비동기 폭포 테스트가 중단 된 것 같습니다.

분류에서Dev

모카로 비동기 폭포 테스트가 중단 된 것 같습니다.

분류에서Dev

Java 동기화 메소드 문서가 잘못된 것 같습니다.

분류에서Dev

14:04 MPM이 스레드 된 것 같습니다. cgi 대신 cgid를 선택합니다. 모듈 cgid가 이미 활성화되었습니다.

분류에서Dev

데이터베이스에 대한 액세스 취소가 작동하지 않는 것 같습니다.

분류에서Dev

동기화 섹션이 완료되지 않은 상태에서 왜 다른 스레드가 차단 된 개체에 액세스 할 수 있습니까?

분류에서Dev

비슷한 파이썬 코드 두 세트가 다르게 작동하는 것 같습니다.

분류에서Dev

Ubuntu 18.04로 업그레이드 한 후 디스플레이가 확대 된 것과 같습니다.

분류에서Dev

win10에서 디스플레이가 꺼지면 Java 스레드가 일시 중지 된 것 같습니다.

분류에서Dev

Javassist가 잘못된 필드 액세스 코드를 생성하는 것 같습니다.

분류에서Dev

저장된 데이터가 파일 읽기 루프에서 액세스 할 수있는 것과 동일하지 않습니다.

분류에서Dev

Nginx-오래된 파이썬 스크립트를 실행하는 것 같습니다.

분류에서Dev

파일에 텍스트를 추가하는 동안 lsof는 파일이 열려 있거나 액세스 된 것으로 표시하지 않습니다.

분류에서Dev

모달이 true로 설정된 JDialog가 생성되면 내 스레드가 영원히 잠기는 것 같습니다.

분류에서Dev

자바 동기화되지 않은 경우 일 업데이트 변수의 값은 결국 다른 스레드 볼 된 스레드 것인가?

분류에서Dev

파이썬은 다중 스레드로 최적화합니까?

분류에서Dev

파이썬이 텍스트 파일에서 읽지 않는 것 같습니다.

분류에서Dev

왠지 단말기가 꽤 엉망이 된 것 같습니다

분류에서Dev

동기화 된 메서드 다중 스레딩 앱

분류에서Dev

스토리 보드의 사용자 정의 테이블보기 셀 레이아웃이 잘못된 것 같습니다.

분류에서Dev

중첩 된 다중 계층 비동기 / 대기 대기가 대기하지 않는 것 같습니다.

분류에서Dev

동기화 된 스레드를 실행할 수 없습니다

분류에서Dev

안드로이드, 다중 스레드, 동기화

분류에서Dev

파이썬 다중 스레드 성능

분류에서Dev

부모 __vftable 간의 다중 상속 캐스팅이 손상된 것 같습니다.

분류에서Dev

시계 시뮬레이터 버튼이 비활성화 된 것 같습니다.

분류에서Dev

세마포가 여러 스레드에서 올바르게 작동하지 않는 것 같습니다.

Related 관련 기사

  1. 1

    Outlook 365 클라이언트 동기화 프로세스가 중단 된 것 같습니다.

  2. 2

    클래스의 C ++ 속성이 다시 초기화 된 것 같습니다.

  3. 3

    모카로 비동기 폭포 테스트가 중단 된 것 같습니다.

  4. 4

    모카로 비동기 폭포 테스트가 중단 된 것 같습니다.

  5. 5

    Java 동기화 메소드 문서가 잘못된 것 같습니다.

  6. 6

    14:04 MPM이 스레드 된 것 같습니다. cgi 대신 cgid를 선택합니다. 모듈 cgid가 이미 활성화되었습니다.

  7. 7

    데이터베이스에 대한 액세스 취소가 작동하지 않는 것 같습니다.

  8. 8

    동기화 섹션이 완료되지 않은 상태에서 왜 다른 스레드가 차단 된 개체에 액세스 할 수 있습니까?

  9. 9

    비슷한 파이썬 코드 두 세트가 다르게 작동하는 것 같습니다.

  10. 10

    Ubuntu 18.04로 업그레이드 한 후 디스플레이가 확대 된 것과 같습니다.

  11. 11

    win10에서 디스플레이가 꺼지면 Java 스레드가 일시 중지 된 것 같습니다.

  12. 12

    Javassist가 잘못된 필드 액세스 코드를 생성하는 것 같습니다.

  13. 13

    저장된 데이터가 파일 읽기 루프에서 액세스 할 수있는 것과 동일하지 않습니다.

  14. 14

    Nginx-오래된 파이썬 스크립트를 실행하는 것 같습니다.

  15. 15

    파일에 텍스트를 추가하는 동안 lsof는 파일이 열려 있거나 액세스 된 것으로 표시하지 않습니다.

  16. 16

    모달이 true로 설정된 JDialog가 생성되면 내 스레드가 영원히 잠기는 것 같습니다.

  17. 17

    자바 동기화되지 않은 경우 일 업데이트 변수의 값은 결국 다른 스레드 볼 된 스레드 것인가?

  18. 18

    파이썬은 다중 스레드로 최적화합니까?

  19. 19

    파이썬이 텍스트 파일에서 읽지 않는 것 같습니다.

  20. 20

    왠지 단말기가 꽤 엉망이 된 것 같습니다

  21. 21

    동기화 된 메서드 다중 스레딩 앱

  22. 22

    스토리 보드의 사용자 정의 테이블보기 셀 레이아웃이 잘못된 것 같습니다.

  23. 23

    중첩 된 다중 계층 비동기 / 대기 대기가 대기하지 않는 것 같습니다.

  24. 24

    동기화 된 스레드를 실행할 수 없습니다

  25. 25

    안드로이드, 다중 스레드, 동기화

  26. 26

    파이썬 다중 스레드 성능

  27. 27

    부모 __vftable 간의 다중 상속 캐스팅이 손상된 것 같습니다.

  28. 28

    시계 시뮬레이터 버튼이 비활성화 된 것 같습니다.

  29. 29

    세마포가 여러 스레드에서 올바르게 작동하지 않는 것 같습니다.

뜨겁다태그

보관