cari

Rumah  >  Soal Jawab  >  teks badan

关于下列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 hari yang lalu450

membalas semua(3)saya akan balas

  • 巴扎黑

    巴扎黑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()
    

    balas
    0
  • PHPz

    PHPz2017-04-18 09:19:00

    Tiga mata pengetahuan terlibat di sini

    1. 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

    2. strategi penjadualan benang python tetingkap/linux
      Cari "strategi penjadualan benang tetingkap" atau "strategi penjadualan benang linux"

    3. kunci GIL python - proses tunggal PYTHON tanpa selari

    Maka anda akan faham

    balas
    0
  • 巴扎黑

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

    Anda boleh menjalankannya beberapa kali dan anda akan faham

    balas
    0
  • Batalbalas