2013-01-09 27 views
5

Tôi đang cố gắng triển khai luồng (sử dụng trình trang trí) cho ứng dụng của mình, nhưng không thể hiểu một số điều về khóa và quản lý chuỗi.Chủ đề với trang trí

import threading 

def run_in_thread(fn): 
    def run(*k, **kw): 
     t = threading.Thread(target=fn, args=k, kwargs=kw) 
     t.start() 
    return run 

class A: 
    @run_in_thread 
    def method1(self): 
     for x in range(10000): 
      print x 


    @run_in_thread 
    def method2(self): 
     for y in list('wlkefjwfejwiefwhfwfkjshkjadgfjhkewgfjwjefjwe'): 
      print y 

    def stop_thread(self): 
     pass 

c = A() 
c.method1() 
c.method2() 
  1. Theo tôi được biết, method1 và method2 chưa đồng bộ, nhưng đồng bộ hóa những thứ đó thực hiện với sự giúp đỡ của ổ khóa. Làm thế nào tôi có thể thêm khóa vào chức năng trang trí của tôi?

  2. Làm cách nào tôi có thể nhận ra phương pháp dừng chuỗi dài bằng cách sử dụng trang trí?

+0

Bạn muốn đồng bộ hóa giữa hai chủ đề là gì? – awatts

+0

Có thể tôi đã nói điều gì đó không chính xác. Tôi muốn có khả năng trong một số trường hợp (không phải luôn luôn) chạy chuỗi thứ hai sau 1 chuỗi, không phải song song. –

+0

Chắc chắn cách đơn giản để làm điều đó là không chạy mã trong một chuỗi trong trường hợp đó. Trong trường hợp đó bạn có thể có hai phương thức tương tự, một phương thức thực hiện nhiệm vụ trong một luồng và một tác vụ không thực hiện. Ngoài ra, hãy chuyển vào một tham số khi gọi điện cho biết cuộc gọi có được nối hay không. – awatts

Trả lời

4

Sử dụng

def run_in_thread(fn): 
    def run(*k, **kw): 
     t = threading.Thread(target=fn, args=k, kwargs=kw) 
     t.start() 
     return t # <-- this is new! 
    return run 

cho phép bạn kiểm soát tốt hơn các chủ đề: bạn có thể làm sau đó

c = A() 
t1 = c.method1() 
t1.join() # wait for it to finish 
t2 = c.method2() 
# ... 
3
  1. Nếu bạn muốn đồng bộ hóa hai chủ đề bạn chỉ cần thêm ổ khóa bên trong các chức năng trang trí, không phải là trang trí bản thân.

  2. Không có cách nào đơn giản để dừng trực tiếp Chủ đề, cách duy nhất là sử dụng Sự kiện để báo hiệu luồng mà nó phải thoát.

Đối với trình trang trí theo luồng bạn có thể xem pebble.

+0

Trông rất thú vị. – glglgl

0

lẽ Semaphores có thể giúp đỡ trong việc trang trí, một cái gì đó như thế này - tính số thừa 1-1000 :

import threading 

from functools import wraps 
from math import factorial 


DIC = {} 

def limit(number): 
    ''' This decorator limits the number of simultaneous Threads 
    ''' 
    sem = threading.Semaphore(number) 
    def wrapper(func): 
     @wraps(func) 
     def wrapped(*args): 
      with sem: 
       return func(*args) 
     return wrapped 
    return wrapper 

def async(f): 
    ''' This decorator executes a function in a Thread''' 
    @wraps(f) 
    def wrapper(*args, **kwargs): 
     thr = threading.Thread(target=f, args=args, kwargs=kwargs) 
     thr.start() 
    return wrapper 

@limit(10)  # Always use @limit as the outter decorator 
@async 
def calcula_fatorial(number): 
    DIC.update({number: factorial(number)}) 

@limit(10) 
def main(lista): 
    for elem in lista: 
     calcula_fatorial(elem) 


if __name__ == '__main__': 
    from pprint import pprint 
    main(range(1000)) 
    pprint(DIC) 
Các vấn đề liên quan