2016-04-27 17 views
0

ピンを推測するスクリプトを作成しましたが、それは動作しますが、スクリプトはsleepコマンドを無視し、threading.lock()コマンドも機能しません。私のスクリプトを見て、スクリプトを改善する方法を教えてください。リストの最後にPythonでのマルチスレッド化は?

#!/usr/bin/env python -w 
# 
# 
import time 
import random 
import os 
import threading 
import sys 


lock = threading.Lock() 
def Random(name,repeat): 
    lock.acquire 
    while repeat != 0: 
     Pin = random.randint(0,9999)   
     print "[+] Trying: %d"%Pin;time.sleep(3) 
     if Pin == 5656: 
      os.system("clear");print '[+] Pin Found: %d' %Pin;time.sleep(3) 
      sys.exit() 
     repeat-= 1 

    if lock.acquire(): 
     lock.release() 


def Order(name,repeat): 
    lock.acquire 

    while repeat != 0: 
     Pin = random.randint(0,9999)   
     print "[!] Trying: %d"%Pin;time.sleep(3) 

     if Pin == 5656: 
      os.system("clear");print '[+] Pin Found: %d' %Pin;time.sleep(3) 
      sys.exit() 
     repeat-= 1 



    if lock.acquire(): 
     lock.release() 




def Main(): 
    Brute_1 = threading.Thread(target=Random,args=('Random_Guess',10)) 
    Brute_2 = threading.Thread(target=Order,args=('Order_Guess',10)) 
    Brute_1.start() 
    Brute_2.start() 


if __name__=='__main__': 
    Start = raw_input("Press Enter To Start") 
    while 1: 
     os.system("clear"); 
     Main() 
+1

あなたは関数の先頭で 'acquire'を呼び出すことさえせず、funcの終わりに呼び出すべきではありません。私は 'acquire'と' release'を直接呼び出すつもりはありません。 'with'ステートメントでロックを使用してください。 – pasztorpisti

答えて

0

whileループは、を介して2つの新しいスレッドを毎回作成されます。 sleep関数は、メインスレッドではなく、新しいスレッドによって呼び出されるので、メインスレッドは可能な限り速くループwhileを通過します。これは、システムがクラッシュするまで、何千もの新しいスレッドを生成します。あなたはと思う。スリープ機能は動作していないが、それはもちろんである。コンソールに表示される行が表示されるたびに、新しいスレッドによって最初に推定されたものです。私はそれがあなたが望むものだとは思わない。私はあなたが何をしようとしているのか分からないので、私はさらに助けることができません。

pasztorpistiと同様に、lock.acquireは関数であり、関数呼び出し構文(lock.acquire())で呼び出す必要があります。そうしないと何も起こりません。それを言って、最初に上位レベルの構造を整理する必要があります。

ロックを取得すると、他のスレッドは同じロックを取得しようとするとブロックされます。 time.sleep関数はロックを解除しません。したがって、Thread1がスリープしているにもかかわらず、Thread1がロックを持つ限り、Thread2はそれを取得できません。

関連する問題