在 IBM® developerWorks®
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598chengxu.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yinwei.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yinwei.gif)
![](/icons/32598dou.gif)
![](/icons/32598diaoyong.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
幸运
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
fork 介绍
进程和线程在并发性
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
fork.py
#!/usr/bin/env python
"""A basic fork in action"""
import os
def my_fork
:
child_pid = os.fork
child_pid
0:
pr
"Child Process: PID# %s" % os.getpid
:
pr
"Parent Process: PID# %s" % os.getpid
__name__
"__
__":
my_fork
现在来看
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
mac% python fork.py
Parent Process: PID# 5285
Child Process: PID# 5286
在下
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598chushi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
举例 1. Python 中
![](/icons/32598de.gif)
#!/usr/bin/env python
"""A fork that demonstrates a copied environment"""
import os
from os import environ
def my_fork
:
environ['FOO']="baz"
pr
"FOO environmental variable
to: %s" % environ['FOO']
environ['FOO']="bar"
pr
"FOO environmental variable changed to: %s" % environ['FOO']
child_pid = os.fork
child_pid
0:
pr
"Child Process: PID# %s" % os.getpid
pr
"Child FOO environmental variable
%s" % environ['FOO']
:
pr
"Parent Process: PID# %s" % os.getpid
pr
"Parent FOO environmental variable
%s" % environ['FOO']
__name__
"__
__":
my_fork
下面给出了 fork
![](/icons/32598de.gif)
mac% python env_fork.py
FOO environmental variable
to: baz
FOO environmental variable changed to: bar
Parent Process: PID# 5333
Parent FOO environmental variable
bar
Child Process: PID# 5334
Child FOO environmental variable
bar
在输出中
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
多进程介绍
现在您已经了解 Python fork 操作
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
举例 2. 简单
![](/icons/32598de.gif)
#!/usr/bin/env python
from multiprocessing import Process
import os
import time
def sleeper(name, seconds):
pr
'starting child process with id: ', os.getpid
pr
'parent process:', os.getppid
pr
'sleeping for %s ' % seconds
time.sleep(seconds)
pr
"Done sleeping"
__name__
'__
__':
pr
"in parent process (id %s)" % os.getpid
p = Process(target=sleeper, args=('bob', 5))
p.start
pr
"in parent process after child process start"
pr
"parent process about to join child process"
p.join
pr
"in parent process after child process join"
pr
"parent process exiting with id ", os.getpid
pr
"The parent's parent process:", os.getppid
如果查看输出
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
mac% python simple.py
in parent process (id 5245)
in parent process after child process start
parent process about to join child process
starting child process with id: 5246
parent process: 5245
sleeping for 5
Done sleeping
in parent process after child process join
parent process exiting with id 5245
The parent's parent process: 5231
可以看到从主进程分出了
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598diaoyong.gif)
![](/icons/32598kh.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598chengxu.gif)
![](/icons/32598de.gif)
![](/icons/32598chengxu.gif)
![](/icons/32598dou2.gif)
构建异步 Net-SNMP 引擎
到目前为止
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598yi.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598diaoyong.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
在开始的前
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
下载 Python 2.6 并针对所使用
![](/icons/32598de.gif)
调整 shell 路径
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
下载并安装设置工具:设置工具
下载 Net-SNMP
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
按如下所示编译 Net-SNMP:
---------------------------------------------------------
Net-SNMP configuration summary:
---------------------------------------------------------
SNMP Versions Supported: 1 2c 3
Net-SNMP Version: 5.4.2.1
Building for: darwin9
Network transport support: Callback Unix TCP UDP
SNMPv3 Security Modules: usm
Agent MIB code: default_modules => snmpv3mibs mibII ucd_snmp not
ication
not
ication-log-mib target agent_mibs agentx disman/event disman/schedule utilities
Embedded Perl support: enabled
SNMP Perl modules: building -- embeddable
SNMP Python modules: building for /usr/local/bin//python
Authentication support: MD5 SHA1
Encryption support: DES AES
]]
查看以下模块
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
举例 3. Net-SNMP
![](/icons/32598de.gif)
#!/usr/bin/env python2.6
"""
This is a multiprocessing wrapper for Net-SNMP.
This makes a synchronous API asynchronous by combining
it with Python2.6
"""
import netsnmp
from multiprocessing import Process, Queue, current_process
HostRecord
:
"""This creates a host record"""
def __init__(self,
hostname = None,
query = None):
self.hostname = hostname
self.query = query
SnmpSession
:
"""A SNMP Session"""
def __init__(self,
oid = "sysDescr",
Version = 2,
DestHost = "localhost",
Community = "public",
Verbose = True,
):
self.oid = oid
self.Version = Version
self.DestHost = DestHost
self.Community = Community
self.Verbose = Verbose
self.var = netsnmp.Varbind(oid, 0)
self.hostrec = HostRecord
self.hostrec.hostname = self.DestHost
def query(self):
"""Creates SNMP query
Fills out a Host Object and
s result
"""
try:
result = netsnmp.snmpget(self.var,
Version = self.Version,
DestHost = self.DestHost,
Community = self.Community)
self.hostrec.query = result
except Exception, err:
self.Verbose:
pr
err
self.hostrec.query = None
finally:
self.hostrec
def make_query(host):
"""This does the actual snmp query
This is a bit fancy as it accepts both instances
of SnmpSession and host/ip addresses. This
allows a user to customize mass queries with
sub
s of d
ferent hostnames and community
s
"""
isinstance(host,SnmpSession):
host.query
:
s = SnmpSession(DestHost=host)
s.query
# Function run by worker processes
def worker(input, output):
for func in iter(input.get, 'STOP'):
result = make_query(func)
output.put(result)
def ![](/icons/32598main.gif)
:
"""Runs everything"""
#clients
hosts = ["localhost", "localhost"]
NUMBER_OF_PROCESSES = len(hosts)
# Create queues
task_queue = Queue
done_queue = Queue
#submit tasks
for host in hosts:
task_queue.put(host)
#Start worker processes
for i in range(NUMBER_OF_PROCESSES):
Process(target=worker, args=(task_queue, done_queue)).start
# Get and pr
results
pr
'Unordered results:'
for i in range(len(hosts)):
pr
'\t', done_queue.get
.query
# Tell child processes to stop
for i in range(NUMBER_OF_PROCESSES):
task_queue.put('STOP')
pr
"Stopping Process #%s" % i
__name__
"__
__":
![](/icons/32598main.gif)
这里有两个类
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
![](/icons/32598yi.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598diaoyong.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
需要特别关注
![](/icons/32598yi.gif)
![](/icons/32598hanshu.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
如果在对 Net-SNMP 进行监听
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
mac% time python multisnmp.py
Unordered results:
('Darwin mac.local 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008;
root:xnu-1228.9.59~1/RELEASE_I386 i386',)
('Darwin mac.local 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008;
root:xnu-1228.9.59~1/RELEASE_I386 i386',)
Stopping Process #0
Stopping Process #1
python multisnmp.py 0.18s user 0.08s system 107% cpu 0.236 total
配置 OS X
![](/icons/32598de.gif)
如果希望配置 OS X
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
$ sudo cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak.testing
$ sudo echo "rocommunity public" > /etc/snmp/snmpd.conf
$ sudo snmpd
这将有效地备份您
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
![](/icons/32598dou.gif)
/
![](/icons/32598System.gif)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD
PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<
>org.net-snmp.snmpd</
>
<key>OnDemand</key>
<false/>
<key>Program</key>
<
>/usr/sbin/snmpd</
>
<key>ProgramArguments</key>
<
.gif' />>
<
>snmpd</
>
<
>-f</
>
</
.gif' />>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
如果希望对多台机器进行测试
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
hosts = ["192.168.1.100", SnmpSession(DestHost="example.com", Community="mysecret"),
"example.net", "example.org"]
运行作业
![](/icons/32598de.gif)
![](/icons/32598hanshu.gif)
![](/icons/32598zifu.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
结束语
官方文档和多进程库
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou2.gif)
除了以上
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
![](/icons/32598yi.gif)
![](/icons/32598dou.gif)
![](/icons/32598de.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou.gif)
![](/icons/32598dou2.gif)
![](/icons/32598de.gif)
最新评论