下面代码是《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的显示内容混合到一起了,这样是对的吗?为什么会这样?
巴扎黑2017-04-18 09:19:00
여기서 잠가야 합니다. 표준 출력은 모든 사람이 동시에 화면에 쓸 수 있으므로 혼란스러울 수 있습니다.
지금 작성하려고 하는 스레드를 다른 스레드에 알리려면 여기에 뮤텍스 잠금을 추가해야 하므로 아직 작성하지 마세요. 그런 다음 작성이 끝난 후 다른 스레드에 내가 작성을 마쳤다고 알리면 신청할 수 있습니다. 쓰다.
루프 함수는 다음과 같이 작성됩니다:
으아악모든 코드는 다음과 같습니다.
으아악PHPz2017-04-18 09:19:00
여기에는 세 가지 지식 포인트가 관련되어 있습니다
Python 스레드 스케줄링 전략
Python 스레드는 실제로 운영 체제에서 지원하는 기본 스레드입니다. Python의 멀티스레딩 메커니즘은 운영 체제의 기본 스레드 메커니즘을 기반으로 합니다.
window/linux python 스레드 예약 전략
"창 스레드 예약 전략" 또는 "linux 스레드 예약 전략"을 검색하세요
python GIL 잠금 - 병렬 처리가 없는 PYTHON 단일 프로세스
그러면 이해하실 겁니다