찾다

 >  Q&A  >  본문

关于下列python多线程代码输出效果的疑问?

下面代码是《python核心编程》关于多线程编程一章中的一个例子:

#!/usr/bin/env python

import threading
from time import sleep, ctime

loops = [ 4, 2 ]

class MyThread(threading.Thread):
    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args

    def run(self):
        apply(self.func, self.args)

def loop(nloop, nsec):
    print 'start loop', nloop, 'at:', ctime()
    sleep(nsec)
    print 'loop', nloop, 'done at:', ctime()

def main():
    print 'starting at:', ctime()
    threads = []
    nloops = range(len(loops))

    for i in nloops:
        t = MyThread(loop, (i, loops[i]),
        loop.__name__)
        threads.append(t)

    for i in nloops:
        threads[i].start()

    for i in nloops:
        threads[i].join()

    print 'all DONE at:', ctime()

if __name__ == '__main__':
    main()

书上显示的输出结果是这样的

我自己打了一遍,输出结果是这样的

可以看到,我的loop0和loop1的显示内容混合到一起了,这样是对的吗?为什么会这样?

PHP中文网PHP中文网2889일 전449

모든 응답(3)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-18 09:19:00

    여기서 잠가야 합니다. 표준 출력은 모든 사람이 동시에 화면에 쓸 수 있으므로 혼란스러울 수 있습니다.
    지금 작성하려고 하는 스레드를 다른 스레드에 알리려면 여기에 뮤텍스 잠금을 추가해야 하므로 아직 작성하지 마세요. 그런 다음 작성이 끝난 후 다른 스레드에 내가 작성을 마쳤다고 알리면 신청할 수 있습니다. 쓰다.

    루프 함수는 다음과 같이 작성됩니다:

    으아악

    모든 코드는 다음과 같습니다.

    으아악

    회신하다
    0
  • PHPz

    PHPz2017-04-18 09:19:00

    여기에는 세 가지 지식 포인트가 관련되어 있습니다

    1. Python 스레드 스케줄링 전략
      Python 스레드는 실제로 운영 체제에서 지원하는 기본 스레드입니다. Python의 멀티스레딩 메커니즘은 운영 체제의 기본 스레드 메커니즘을 기반으로 합니다.

    2. window/linux python 스레드 예약 전략
      "창 스레드 예약 전략" 또는 "linux 스레드 예약 전략"을 검색하세요

    3. python GIL 잠금 - 병렬 처리가 없는 PYTHON 단일 프로세스

    그러면 이해하실 겁니다

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:19:00

    몇 번 실행해 보시면 이해하실 수 있을 것입니다

    회신하다
    0
  • 취소회신하다