在实际代码开发中,gui的代码并不好写。因为不管是mvc、还是mvp都有一定的局限性。那么,这个时候,我就在想,是不是可以用mvp+reactor的方法进行gui的改进操作呢?首先app编写好界面代码之后,就等着外界的条件出发。比如说,等到键盘响应后,此时回调函数就收集到控件数据后发送给reactor,这个时候不需要等返回结果就结束了。如果reactor处理后好,这个时候,模块就给gui发送消息,gui收到消息后,从reactor请求数据,这个请求是阻塞的,可以利用生产者和消费者的方式解决。当然,因为生产者可能很多,生产者还是要用lock保护起来的,消费者就不用锁保护了。
如下就是改进后的线程同步代码,
#!/usr/bin/python
import os
import sys
import re
import threading
import signal
import time
g_exit = 0
flag = 0
val = 0
mutex = threading.Lock()
sem = threading.Semaphore(0)
def sig_process(sig, frame):
global g_exit
sem.release()
g_exit = 1
def produce():
cnt = 0
global flag
global val
while not g_exit:
mutex.acquire()
if 0 == flag:
pass
else:
cnt += 1
val = cnt
flag = 0
print 'feed'
sem.release()
mutex.release()
def consume():
global flag
while not g_exit:
flag = 1
print 'send'
sem.acquire()
print val
time.sleep(1)
def main():
signal.signal(signal.SIGINT, sig_process)
td1 = threading.Thread(target = produce)
td1.start()
td2 = threading.Thread(target = consume)
td2.start()
while not g_exit:
time.sleep(5)
td2.join()
td1.join()
if __name__ == '__main__':
main()
大家可以直接在机器上尝试运行一下,看看结果和期待的是否一样:-)