- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python多线程抽象编程模型详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近需要完成一个多线程下载的工具,对其中的多线程下载进行了一个抽象,可以对所有需要使用到多线程编程的地方统一使用这个模型来进行编写.
主要结构:
1、基于Queue标准库实现了一个类似线程池的工具,用户指定提交任务线程submitter与工作线程worker数目,所有线程分别设置为后台运行,提供等待线程运行完成的接口.
2、所有需要完成的任务抽象成task,提供单独的无参数调用方式,供worker线程调用;task以生成器的方式作为参数提供,供submitter调用.
3、所有需要进行线程交互的信息放在context类中.
主要实现代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#Submitter线程类实现,主要是`task_generator`调用
class
SubmitterThread(threading.Thread):
_DEFAULT_WAIT_TIMEOUT
=
2
#seconds
def
__init__(
self
, queue, task_gen, timeout
=
2
):
super
(SubmitterThread,
self
).__init__()
self
.queue
=
queue
if
not
isinstance
(timeout,
int
):
_logger.error(
'Thread wait timeout value error: %s, '
'use default instead.'
%
timeout)
self
.timeout
=
self
._DEFAULT_WAIT_TIMEOUT
self
.timeout
=
timeout
self
.task_generator
=
task_gen
def
run(
self
):
while
True
:
try
:
task
=
self
.task_generator.
next
()
self
.queue.put(task,
True
,
self
.timeout)
except
Queue.Full:
_logger.debug(
'Task queue is full. %s wait %d second%s timeout'
%
(
self
.name,
self
.timeout,
's'
if
(
self
.timeout >
1
)
else
''))
break
except
(StopIteration, ValueError) as e:
_logger.debug(
'Task finished'
)
break
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#Worker线程实现,主要就是try块内的func调用
class
WorkerThread(threading.Thread):
_DEFAULT_WAIT_TIMEOUT
=
2
#seconds
def
__init__(
self
, queue, timeout
=
2
):
super
(WorkerThread,
self
).__init__()
self
.queue
=
queue
if
not
isinstance
(timeout,
int
):
_logger.error(
'Thread wait timeout value error: %s, '
'use default instead.'
%
timeout)
self
.timeout
=
self
._DEFAULT_WAIT_TIMEOUT
self
.timeout
=
timeout
def
run(
self
):
while
True
:
try
:
func
=
self
.queue.get(
True
,
self
.timeout)
except
Queue.Empty:
_logger.debug(
'Task queue is empty. %s wait %d second%s timeout'
%
(
self
.name,
self
.timeout,
's'
if
(
self
.timeout >
1
)
else
''))
break
if
not
callable
(func):
time.sleep(
1
)
try
:
func()
except
Exception as e:
_logger.error(
'Thread %s running occurs error: %s'
%
(
self
.name, e))
print
(
'Thread running error: %s'
%
e)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
class
Executor(
object
):
"""
The really place to execute executor
"""
thread_list
=
[]
submitters
=
0
workers
=
0
queue
=
None
task_generator
=
None
timeout
=
0
def
__init__(
self
, task_gen, submitters
=
1
, workers
=
1
, timeout
=
2
):
if
len
(
self
.thread_list) !
=
0
:
raise
RuntimeError(
'Executor can only instance once.'
)
self
.queue
=
Queue.Queue(maxsize
=
submitters
*
2
+
workers
*
2
)
self
.submitters
=
submitters
self
.workers
=
workers
self
.task_generator
=
task_gen
self
.timeout
=
timeout
def
start(
self
):
for
i
in
range
(
self
.submitters):
submitter
=
SubmitterThread(
self
.queue,
self
.task_generator,
self
.timeout)
self
.thread_list.append(submitter)
submitter.setName(
'Submitter-%d'
%
i)
submitter.setDaemon(
True
)
submitter.start()
for
i
in
range
(
self
.workers):
worker
=
WorkerThread(
self
.queue,
self
.timeout)
self
.thread_list.append(worker)
worker.setName(
'Worker-%d'
%
i)
worker.setDaemon(
True
)
worker.start()
def
is_alive(
self
):
alive
=
False
for
t
in
self
.thread_list:
if
t.isAlive():
alive
=
True
break
return
alive
def
wait_to_shutdown(
self
):
_logger.debug(
'Start to wait to shutdown'
)
for
t
in
self
.thread_list:
t.join()
_logger.debug(
'Shutdown thread : %s'
%
t.name)
|
Executor类保存了线程池,提供相应接口。有了这个抽象之后,只需要实例化Executor类的对象,然后调用start方法进行多线程任务的运行。并可以用is_alive等接口再主线程内进行其他处理.
后续再使用这个抽象进行实际多线程任务的实现.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/u010487568/article/details/52081875 。
最后此篇关于python多线程抽象编程模型详解的文章就讲到这里了,如果你想了解更多关于python多线程抽象编程模型详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对 java 中的抽象有点困惑。 我查了很多页面说抽象就是数据隐藏(隐藏实现)。 我对抽象的理解是它是“部分实现”。只需在抽象类/接口(interface)中定义您需要的内容,然后扩展/实现它们并添
我是 Ruby 的新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。 我四处搜索,发现了一个名为
目录 Java基础知识(抽象) 抽象 抽象定义 abstract的使用 定义抽象类
这个月我花了一些时间与 Emacs Lisp 进行斗争,试图获得更好地满足我需求的自动缩进。令人惊讶的是,大多数缩进代码是多么低级。我只看到了很少的抽象,例如 搜索不在字符串或注释中的第一个正则表达式
我有以下内容: public abstract class Foo{ //contents of Foo // ... public class Bar extends
我有三个类(class)(A 类、B 类和 C 类)。 类 A 调用 B 的实例并运行 start()。 B类扩展了Thread,因此当调用start()时,run()方法中的任何内容都会被执行。 在
这个问题已经有答案了: Calling a subclass method from superclass (5 个回答) 已关闭 7 年前。 Klasse1是一个抽象类,有一个 foo()方法。 K
我有一个这样的函数: def test(): x = "3" # In actual code, this is computed if x is None: retu
我有两个基类之间的关系: public abstract class RecruiterBase { // Properties declare here // Constructors de
这是我第一次发帖,但我遇到了很多问题。我目前有一个带有标题的 AbstractDevice 类: public abstract class AbstractDevice> implements De
我有一个 MotorDefinition 类和一个名为 Motor 的抽象类: class MotorDefinition { public: MotorDefinition(int p1,
是否有任何方法可以在这种代码(sass)中制定 css 的抽象规则: #cottage-image-gallery input:nth-of-type(1):checked ~ label:nth-o
是否可以声明一个已知的基类型并允许传输所有派生类型? [ServiceContract] public interface IService { [OperationContract]
我目前正在为基于 Java 的文本游戏开发角色生成机制,但我遇到了一个问题,看不出哪里出了问题。我有一个“Character”类,它是抽象的,然后是另一个类“NPCharacter”,它是建立在这个之
抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在! 我正在寻找一个好的抽象来用于涉及并发线程的情况。 我已经接近了,但还不是很清楚。 稍微简化一下,我在 Android 手机上收集了两种传感器
提前感谢您阅读本文。我不完全理解如何/何时使用摘要,所以我试图在我从事的每个项目中考虑它,看看它是否会在某一天全部点击 Smile | :) 此外,可访问性级别(私有(private)、 protec
我正在探索用于生成 Web 内容的 XML -> XSLT -> HTML 模因。我的 XSLT 经验很少。 我很好奇 XSLT 中有哪些机制可用于处理抽象或“重构”。 例如,使用通用 HTML 和服
在这些谈话中 Nicholas Zakas和 Addy Osmani他们讨论了在构建大型 Javascript 应用程序时将外观模式用作沙箱的想法,以便将应用程序与底层基础库分离。 这种解耦理论上允许
我使用C++和CUDA/C,想为特定问题编写代码,但遇到了一个非常棘手的简化问题。 我在并行编程方面的经验不容忽视,但相当有限,我无法完全预见到此问题的特殊性。 我怀疑是否有一种方便甚至“轻松”的方式
假设我有: trait A class B extends A class C extends A 有没有办法配置类型参数: class Foo[AType <: A with canCreateIn
我是一名优秀的程序员,十分优秀!