VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:threading进程中管理并发操作(4)

  • import logging
  • import threading
  • import time
  •  
  • def wait_for_event(e):
  • """Wait for the event to be set before doing anything"""
  • logging.debug('wait_for_event starting')
  • event_is_set = e.wait()
  • logging.debug('event set: %s', event_is_set)
  •  
  • def wait_for_event_timeout(e, t):
  • """Wait t seconds and then timeout"""
  • while not e.is_set():
  • logging.debug('wait_for_event_timeout starting')
  • event_is_set = e.wait(t)
  • logging.debug('event set: %s', event_is_set)
  • if event_is_set:
  • logging.debug('processing event')
  • else:
  • logging.debug('doing other work')
  •  
  • logging.basicConfig(
  • level=logging.DEBUG,
  • format='(%(threadName)-10s) %(message)s',
  • )
  •  
  • e = threading.Event()
  • t1 = threading.Thread(
  • name='block',
  • target=wait_for_event,
  • args=(e,),
  • )
  • t1.start()
  •  
  • t2 = threading.Thread(
  • name='nonblock',
  • target=wait_for_event_timeout,
  • args=(e, 2),
  • )
  • t2.start()
  •  
  • logging.debug('Waiting before calling Event.set()')
  • time.sleep(0.3)
  • e.set()
  • logging.debug('Event is set')
  • wait()方法取一个参数,表示等待事件的时间(秒数),达到这个时间后就超时。它 会返回一个布尔值,指示事件是否已设置,使调用者知道wait()为什么返回。可以对事 件单独地使用is_set()方法而不必担心阻塞。

    在这个例子中,wait_for_event_timeout()将检查事件状态而不会无限阻塞。wait_for_event()在wait()调用的位置阻塞,事件状态改变之前它不会返回。

    1.8 控制资源访问

    除了同步线程操作,还有一点很重要,要能够控制对共享资源的访问,从而避免破坏或丢失数据。Python的内置数据结构(列表、字典等)是线程安全的,这是Python使用原子字节码来管理这些数据结构的一个副作用(更新过程中不会释放保护Python内部数据结构的全局解释器锁GIL(Global Interpreter Lock))。Python中实现的其他数据结构或更简单的类型(如整数和浮点数)则没有这个保护。要保证同时安全地访问一个对象,可以使用一个Lock对象。

    
    	
    1. import logging
    2. import random
    3. import threading
    4. import time
    5.  
    6. class Counter:
    7.  
    8. def __init__(self, start=0):
    9. self.lock = threading.Lock()
    10. self.value = start
    11.  
    12. def increment(self):
    13. logging.debug('Waiting for lock')
    14. self.lock.acquire()
    15. try:
    16. logging.debug('Acquired lock')
    17. self.value = self.value + 1
    18. finally:
    19. self.lock.release()
    20.  
    21. def worker(c):
    22. for i in range(2):
    23. pause = random.random()
    24. logging.debug('Sleeping %0.02f', pause)
    25. time.sleep(pause)
    26. c.increment()
    27. logging.debug('Done')
    28.  
    29. logging.basicConfig(
    30. level=logging.DEBUG,
    31. format='(%(threadName)-10s) %(message)s',
    32. )
    33.  
    34. counter = Counter()
    35. for i in range(2):
    36. t = threading.Thread(target=worker, args=(counter,))
    37. t.start()
    38.  
    39. logging.debug('Waiting for worker threads')
    40. main_thread = threading.main_thread()
    41. for t in threading.enumerate():
    42. if t is not main_thread:
    43. t.join()
    44. logging.
    
    相关教程