2017-08-07 120 views
0

說你有4個數字,你需要在Python中使用多線程1打印所有數字的乘法表100。我想出了這個代碼是Python的多線程單獨互斥的任務

from threading import Thread 

def multable(r, number): 
    for i in range(1,101): 
     mul = number*i 
     print "\n%d x %d = %d" %(number, i, mul) 


def Main(): 
    t1 = Thread(target = multable, args = (1, 2)) 
    t2 = Thread(target = multable, args = (1, 3)) 
    t3 = Thread(target = multable, args = (1, 4)) 
    t4 = Thread(target = multable, args = (1, 4)) 
    t1.start() 
    t2.start() 
    t3.start() 
    t4.start() 

if __name__ == '__main__': 
    Main() 

部分輸出 -

4 x 60 = 240 

4 x 61 = 244 

4 x 62 = 248 

3 x 48 = 144 

2 x 78 = 156 
4 x 63 = 252 
3 x 49 = 147 



3 x 50 = 150 

2 x 79 = 158 
3 x 51 = 153 


4 x 64 = 256 

我有關的問題這是 -

  • 爲什麼會出現不均勻的間距,我想應該只有一個兩個輸出之間的線隙,通過在打印語句\n
  • 爲什麼我不能只是通過只有一個變量作爲參數的線程,我這樣做收到錯誤問我給一個迭代的,所以我給了一個無用的價值?
  • 在一個四核CPU,我怎麼可以編輯該程序利用所有四個CPU,每一個號碼/線程。無視輸出的順序?

回答

1

爲什麼會出現不均勻的間距,我覺得應該有一個唯一的線隙輸出 兩者之間,通過在打印語句中的\ n嗎?

我想你得到的間距問題,因爲python刷新每一個新行的標準輸出緩衝區。既然你是在多線程做是沒有排序的保證,這導致寫在每次沖洗的數據寫入隨機順序。

爲什麼我不能只是通過只有一個變量作爲參數的線程, 我這樣做收到錯誤問我給一個迭代的,所以我給了一個 無用的價值?

如果您在()中放置單個值(例如(5)),它實際上意味着5.您需要爲python添加逗號以認爲它是元組(5)。或者你可以使用列表[5]。

在一個四核CPU中,如何編輯該程序以利用四個CPU,每個CPU用於一個數字/線程。無視 輸出的順序?

這應該會自動發生。它將由操作系統安排。如果它看到4個獨立的線程,則應該在每個核心上放置一個線程(具體取決於任務計劃程序)。出於兩個原因,您可能無法在任務管理器中100%地看到所有4個核心。首先,python解釋器並不真正支持多線程。每個python語句都被鎖定,所以一次只能執行一條語句。如果你正在爲python創建C擴展,你可以解決這個問題,但是所有對python解釋器的調用都需要被鎖定。其次,即使你用C編寫了相同的東西,我懷疑你會發現這會燒燬任務管理器中的所有內核。這是一個非常輕巧的IO過程,它不佔用太多CPU。

0

由於您使用的線程每個線程都有自己的輸出,這導致在每過一段時間,他們將在同一時間通過\n到控制檯的事實。這種行爲正在導致您看到不同的空行。

至於傳遞參數,你可以通過以下方式傳遞一個元組:

from threading import Thread 


def multable(number): 
    for i in range(1, 101): 
     mul = number * i 
     print "%d x %d = %d\n" % (number, i, mul) 


def Main(): 
    t1 = Thread(target=multable, args=(2,)) 
    t2 = Thread(target=multable, args=(3,)) 
    t3 = Thread(target=multable, args=(4,)) 
    t4 = Thread(target=multable, args=(4,)) 
    t1.start() 
    t2.start() 
    t3.start() 
    t4.start() 


if __name__ == '__main__': 
    Main() 

從而去除多餘的參數。我建議你使用一個Queue用於打印輸出,這樣可以更好地控制它。

喜歡的東西:

from threading import Thread 
from Queue import Queue 


def multable(number): 
    for i in range(1, 101): 
     mul = number * i 
     q.put("%d x %d = %d\n" % (number, i, mul)) 
     q.task_done() 


def main(): 

    t1 = Thread(target=multable, args=(2,)) 
    t2 = Thread(target=multable, args=(3,)) 
    t3 = Thread(target=multable, args=(4,)) 
    t4 = Thread(target=multable, args=(4,)) 
    t1.start() 
    t2.start() 
    t3.start() 
    t4.start() 

    q.join() 

    while not q.empty(): 
     print '{}\n'.format(q.get()) 

if __name__ == '__main__': 
    q = Queue() 
    main()