2017-07-15 19 views
5

Tôi đang giao thoa ong cho python và muốn chạy cùng một số trường hợp ít ở chế độ song song để tìm nạp dữ liệu và ra quyết định cho thị trường tài chính. Để tiếp tục ý tưởng của mình, tôi chạy đoạn mã sau để xem python hoạt động như thế nào, có vẻ như nó hoạt động hoàn toàn với một cá thể lớp đầu tiên và sau các cá thể lớp thứ hai, tôi muốn chạy điều này một cách tương tự, làm sao tôi có thể ...? Dưới đây là các mã số mẫu để thử nghiệm ..Python Threading không được xử lý song song

import threading 
import time 

class thr(object): 

    def __init__(self, name): 
    self.name = name 
    self.x = 0 

    def run(self): 
    for i in list(range(10)): 
     self.x +=1 
     print("something {0} {1}".format(self.name, self.x)) 
     time.sleep(1)    

F = thr("First") 
S = thr("Second") 

threading.Thread(target=F.run()) 
threading.Thread(target=S.run()) 

và kết quả như sau ....

something First 1 
something First 2 
something First 3 
something First 4 
something First 5 
something First 6 
something First 7 
something First 8 
something First 9 
something First 10 
something Second 1 
something Second 2 
something Second 3 
something Second 4 
something Second 5 
something Second 6 
something Second 7 
something Second 8 
something Second 9 
something Second 10 
Out[27]: <Thread(Thread-25, initial)> 

Trả lời

8

Vấn đề là ở đây:

threading.Thread(target=F.run()) 
threading.Thread(target=S.run()) 

target= mất một callable đối tượng hoặc None. F.run()thực thiF.run ngay lập tức, đợi kết thúc và sau đó chuyển giá trị trả lại (là None trong phương thức run()) làm mục tiêu.

Bạn muốn một cái gì đó như thế này thay vì:

t1 = threading.Thread(target=F.run) 
t2 = threading.Thread(target=S.run) 
t1.start() 
t2.start() 

Lưu ý rằng không có dấu ngoặc đơn sau run

Đây là chương trình hoàn chỉnh với sự thay đổi đề nghị:

import threading 
import time 

class thr(object): 

    def __init__(self, name): 
    self.name = name 
    self.x = 0 

    def run(self): 
    for i in list(range(10)): 
     self.x +=1 
     print("something {0} {1}".format(self.name, self.x)) 
     time.sleep(1)    

F = thr("First") 
S = thr("Second") 

t1 = threading.Thread(target=F.run) 
t2 = threading.Thread(target=S.run) 
t1.start() 
t2.start() 

Và đầu ra (Python 3.6 .1):

$ python sf.py 
something First 1 
something Second 1 
something Second 2 
something First 2 
something Second 3 
something First 3 
something Second 4 
something First 4 
something Second 5 
something First 5 
something Second 6 
something First 6 
something Second 7 
something First 7 
something First 8 
something Second 8 
something First 9 
something Second 9 
something First 10 
something Second 10 
+0

Đối với bất kỳ ai đã bỏ phiếu này: hãy thực hiện thay đổi mà tôi đã đề xuất và thực sự chạy mã. Nó giải quyết vấn đề đã nêu của OP, và chính xác là lý do tôi đưa ra. –

+0

Điều này khá rõ ràng là câu trả lời đúng .. – thebjorn

+1

Có, đó là - nhưng, thật không may, bất cứ ai có thể bỏ phiếu ;-) –

Các vấn đề liên quan