Rumah > Soal Jawab > teks badan
下面代码是《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
Anda perlu menguncinya di sini Output standard ialah sumber dikongsi Semua orang boleh menulis ke skrin pada masa yang sama, jadi ia mungkin mengelirukan.
Anda perlu menambah kunci mutex di sini untuk memberitahu utas lain yang akan saya tulis sekarang, jadi jangan menulisnya lagi Kemudian selepas saya selesai menulis, beritahu utas lain yang saya telah selesai menulis dan anda boleh memohon menulis.
fungsi gelung ditulis sebagai:
import threading
#创建锁
mutex = threading.Lock()
def loop(nloop, nsec):
#锁定
mutex.acquire()
print 'start loop', nloop, 'at:', ctime()
sleep(nsec)
print 'loop', nloop, 'done at:', ctime()
#释放
mutex.release()
Semua kod ialah:
#!/usr/bin/env python
# encoding: utf-8
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)
# 创建锁
mutex = threading.Lock()
def loop(nloop, nsec):
# 锁定
mutex.acquire()
print 'start loop', nloop, 'at:', ctime()
sleep(nsec)
print 'loop', nloop, 'done at:', ctime()
# 释放
mutex.release()
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()
PHPz2017-04-18 09:19:00
Tiga mata pengetahuan terlibat di sini
Strategi penjadualan benang Python
Benang Python sebenarnya adalah benang asli yang disokong oleh mekanisme berbilang benang Python adalah berdasarkan mekanisme urutan asli sistem pengendalian yang berbeza
strategi penjadualan benang python tetingkap/linux
Cari "strategi penjadualan benang tetingkap" atau "strategi penjadualan benang linux"
kunci GIL python - proses tunggal PYTHON tanpa selari
Maka anda akan faham