首先说一下一些小变化:
- 在执行 Casing 模块的start(), start_thread(), start_sync_thread()时,可以输入关键字参数,那么这些参数就可以在运行绑定函数时将同名的关键字参数值进行替换。这样的话,你可以把生成 Casing 对象时传入的参数认为是缺省参数,然后在运行时改变它们的值。注意是,如果有多个绑定函数存在相同的关键字参数(一定要关键字参数的写法,不然不知道参数的对应关系),那么会一起替换掉。
- Casing 增加了一个 copy() 方法,它可以生成一个克隆的对象,这个对象与原始对象一样。
- Casing 增加了isactive() 方法可以判断 Casing 对象是否还在运行。
- 再一个大些的变化就是增加了 MultiCasing 类,它可以实现 Casing 对象集的管理。
下面针对 MultiCasing 来说明。
from Casing import *
import time
import threadingdef test_A(n, syncvar):
for i in range(1, n+1):
if syncvar:
print threading.currentThread().getName(), i
time.sleep(.5)
else:
break
def on_process(syncvar):
print ‘on_process…’def on_finish():
print ‘finished’
def on_abort():
print ‘abort’
control = MultiCasing()
control.onprocess(on_process)
control.onfinish(on_finish)
control.onabort(on_abort)for i in range(0, 100):
d = Casing(test_A, n=5)
control.append(d)
control.start_sync_thread()
time.sleep(30)
print ’stop’
control是一个 MultiCasing 对象,它也象 Casing 对象一样可以有 onprocess, onfinish(Casing中为onsuccess), onabort的回调函数句柄。向它增加一个 Casing 很简单,调用 append() 方法即可。MultiCasing 有两个可传的构造参数,size表示并发线程的个数,缺省为10。need_manual_stop表示是否当所有线程执行完毕后自动停止线程调度,缺省为False,即自动停止。如果自动停止的话,使用append只是增加待处理 Casing 对象,并不进行线程调度。而值为 True 时,一旦运行,当append时,Casing 对象即参加线程调度。
上面的例子演示了加入许多的 Casing 对象,由 MultiCasing 对象来进行调度。上面的例子当所有线程执行完毕后,control就停止了。再添加也无效。如果想生成一个一直有效的对象,需要在构造时指定need_manual_stop=True。这样你可以随时向里面添加 Casing 对象。需要时手工执行 MultiCasing 对象的 stop_thread() 方法即可。请注意,目前 MultiCasing 对象不能重入,即一旦执行了 stop_thread() 之后,再 start_* 结果可能有问题。因此对于再想运行的话,请重新创建 MultiCasing ,并重新加入 Casing 对象。


