Python论坛  - 讨论区

标题:[python-chinese] Casing 模块的cpu占用率问题

2005年12月05日 星期一 19:21

Fat fatbobman at gmail.com
Mon Dec 5 19:21:05 HKT 2005

下面这两个简单的程序一个是使用casing完成多线程调度,一个直接使用python内置模块的多线程调度。
casing因为多了更多的调度功能而会提高cup的占用率我是有心理准备的,不过没想到的是cup的占用率始终是100%。
我尝试过不显示、不增加on_process等办法均不见成效,请limodou看看,问题主要是出在哪。
ps:casing如果能解决这个问题实在是太方便了。


--
我的blog: http://www.donews.net/fatbobman
-------------- next part --------------
A non-text attachment was scrubbed...
Name: casing_test1.py
Type: text/x-python
Size: 873 bytes
Desc: not available
Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20051205/a3ad7c24/casing_test1.py
-------------- next part --------------
A non-text attachment was scrubbed...
Name: thread_test1.py
Type: text/x-python
Size: 448 bytes
Desc: not available
Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20051205/a3ad7c24/thread_test1.py

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月05日 星期一 21:37

limodou limodou at gmail.com
Mon Dec 5 21:37:20 HKT 2005

在 05-12-5,Fat<fatbobman at gmail.com> 写道:
> 下面这两个简单的程序一个是使用casing完成多线程调度,一个直接使用python内置模块的多线程调度。
> casing因为多了更多的调度功能而会提高cup的占用率我是有心理准备的,不过没想到的是cup的占用率始终是100%。
> 我尝试过不显示、不增加on_process等办法均不见成效,请limodou看看,问题主要是出在哪。
> ps:casing如果能解决这个问题实在是太方便了。
>

是嘛,真没关心过。我好好测试一下。

--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月05日 星期一 22:14

limodou limodou at gmail.com
Mon Dec 5 22:14:18 HKT 2005

在 05-12-5,limodou<limodou at gmail.com> 写道:
> 在 05-12-5,Fat<fatbobman at gmail.com> 写道:
> > 下面这两个简单的程序一个是使用casing完成多线程调度,一个直接使用python内置模块的多线程调度。
> > casing因为多了更多的调度功能而会提高cup的占用率我是有心理准备的,不过没想到的是cup的占用率始终是100%。
> > 我尝试过不显示、不增加on_process等办法均不见成效,请limodou看看,问题主要是出在哪。
> > ps:casing如果能解决这个问题实在是太方便了。
> >
>
> 是嘛,真没关心过。我好好测试一下。
>

发现了。是在MultiCasing中的:

    def _start(self, syncvar=None, sync=False):
        self._exit_flag = False
        self.running = True
        while not self._exit_flag:
            self.event.wait(self.timestep)
            if not self.queue.empty() and len(self.active) < self.size:
                casing = self.queue.get()
                self.active.append(casing)
                casing.onsync(self._on_sync, casing)
                if not sync:
                    casing.start_thread()
                else:
                    casing.start_sync_thread()
            elif self.queue.empty() and not self.active: #not more
thread obj need to run
                if not self.need_manual_stop:
                    break
            elif len(self.active) == self.size:
                self.event.clear()
        self.running = False
        if not self.active and self.queue.empty() and self.on_finish:
            self._run(self.on_finish)
        elif self.on_abort:
            self._run(self.on_abort)

原来没有上面的
            elif len(self.active) == self.size:
                self.event.clear()

本来是想利用event对象的,结果没用上。现在加上了。同时在MultiCasing构造方法中增加了timestep参数,可以控制等待的间隔。这回还加上了running_count()和remaining_count()两个方法,可以得到正在运行和未运行的Casing对象的个数。

应该可以了,再试试吧。谢谢报告。
--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月06日 星期二 08:33

Fat fatbobman at gmail.com
Tue Dec 6 08:33:50 HKT 2005

在05-12-5,limodou <limodou at gmail.com> 写道:
>
> 在 05-12-5,limodou<limodou at gmail.com> 写道:
> > 在 05-12-5,Fat<fatbobman at gmail.com> 写道:
> > > 下面这两个简单的程序一个是使用casing完成多线程调度,一个直接使用python内置模块的多线程调度。
> > > casing因为多了更多的调度功能而会提高cup的占用率我是有心理准备的,不过没想到的是cup的占用率始终是100%。
> > > 我尝试过不显示、不增加on_process等办法均不见成效,请limodou看看,问题主要是出在哪。
> > > ps:casing如果能解决这个问题实在是太方便了。
> > >
> >
> > 是嘛,真没关心过。我好好测试一下。
> >
>
> 发现了。是在MultiCasing中的:
>
>     def _start(self, syncvar=None, sync=False):
>         self._exit_flag = False
>         self.running = True
>         while not self._exit_flag:
>             self.event.wait(self.timestep)
>             if not self.queue.empty() and len(self.active) < self.size:
>                 casing = self.queue.get()
>                 self.active.append(casing)
>                 casing.onsync(self._on_sync, casing)
>                 if not sync:
>                     casing.start_thread()
>                 else:
>                     casing.start_sync_thread()
>             elif self.queue.empty() and not self.active: #not more
> thread obj need to run
>                 if not self.need_manual_stop:
>                     break
>             elif len(self.active) == self.size:
>                 self.event.clear()
>         self.running = False
>         if not self.active and self.queue.empty() and self.on_finish:
>             self._run(self.on_finish)
>         elif self.on_abort:
>             self._run(self.on_abort)
>
> 原来没有上面的
>             elif len(self.active) == self.size:
>                 self.event.clear()
>
>
> 本来是想利用event对象的,结果没用上。现在加上了。同时在MultiCasing构造方法中增加了timestep参数,可以控制等待的间隔。这回还加上了running_count()和remaining_count()两个方法,可以得到正在运行和未运行的Casing对象的个数。
>
> 应该可以了,再试试吧。谢谢报告。
> --
>
ok ,睡了一觉就发现改好了:)
上午就测试

--
我的blog: http://www.donews.net/fatbobman
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20051206/b93fcd3f/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月06日 星期二 11:00

Fat fatbobman at gmail.com
Tue Dec 6 11:00:40 HKT 2005

测试结束,一切都很棒。
另外,你在关于casing的第5篇blog中提到,Casing 增加了isactive() 方法可以判断 Casing
对象是否还在运行。我感觉有些误导的成分。这个isactive只是说casing的住线程是否还有,而并不能表示在multicasing、need_manual_stop=True的情况下内部是否仍然有还在运行的casing.
看了你的代码,你其实已经做了一个runing的标志来表示是否有casing在运行。
......

control = MultiCasing(size=3,timestep=1)
control.onprocess(on_process)
control.onfinish(on_finish)
control.onabort(on_abort)

for i in range(3):
    d = Casing(test_A,n=3)
    control.append(d)

control.need_manul_stop=True
control.start_sync_thread()
time.sleep(10)

while 1:
    if control.remaining_count()<10:
        for i in range(30):
            d = Casing(test_A,n=2)+Casing(test_A,n=3)
            control.append(d)
        if not control.running:
            control.start_sync_thread()  #否则只增加,并不运行
    time.sleep(1)


--
我的blog: http://www.donews.net/fatbobman

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号