永发信息网

python 分布式进程用的多吗

答案:2  悬赏:60  手机版
解决时间 2021-02-09 01:23
python 分布式进程用的多吗
最佳答案
Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情。
借助这个包,可以轻松完成从单进程到并发执行的转换。
1、新建单一进程
如果我们新建少量进程,可以如下:
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
if __name__ == "__main__":
p = multiprocessing.Process(target=func, args=("hello", ))
p.start()
p.join()
print "Sub-process done."12345678910111213
2、使用进程池
是的,你没有看错,不是线程池。它可以让你跑满多核CPU,而且使用方法非常简单。
注意要用apply_async,如果落下async,就变成阻塞版本了。
processes=4是最多并发进程数量。
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
for i in xrange(10):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, ))
pool.close()
pool.join()
print "Sub-process(es) done."12345678910111213141516
3、使用Pool,并需要关注结果
更多的时候,我们不仅需要多进程执行,还需要关注每个进程的执行结果,如下:
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
return "done " + msg
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = []
for i in xrange(10):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg, )))
pool.close()
pool.join()
for res in result:
print res.get()
print "Sub-process(es) done."1234567891011121314151617181920
2014.12.25更新
根据网友评论中的反馈,在Windows下运行有可能崩溃(开启了一大堆新窗口、进程),可以通过如下调用来解决:
multiprocessing.freeze_support()1
附录(自己的脚本):
#!/usr/bin/python
import threading
import subprocess
import datetime
import multiprocessing
def dd_test(round, th):
test_file_arg = 'of=/zbkc/test_mds_crash/1m_%s_%s_{}' %(round, th)
command = "seq 100 | xargs -i dd if=/dev/zero %s bs=1M count=1" %test_file_arg
print command
subprocess.call(command,shell=True,stdout=open('/dev/null','w'),stderr=subprocess.STDOUT)
def mds_stat(round):
p = subprocess.Popen("zbkc mds stat", shell = True, stdout = subprocess.PIPE)
out = p.stdout.readlines()
if out[0].find('active') != -1:
command = "echo '0205pm %s round mds status OK, %s' >> /round_record" %(round, datetime.datetime.now())
command_2 = "time (ls /zbkc/test_mds_crash/) 2>>/round_record"
command_3 = "ls /zbkc/test_mds_crash | wc -l >> /round_record"
subprocess.call(command,shell=True)
subprocess.call(command_2,shell=True)
subprocess.call(command_3,shell=True)
return 1
else:
command = "echo '0205 %s round mds status abnormal, %s, %s' >> /round_record" %(round, out[0], datetime.datetime.now())
subprocess.call(command,shell=True)
return 0
#threads = []
for round in range(1, 1600):
pool = multiprocessing.Pool(processes = 10) #使用进程池
for th in range(10):
# th_name = "thread-" + str(th)
# threads.append(th_name) #添加线程到线程列表
# threading.Thread(target = dd_test, args = (round, th), name = th_name).start() #创建多线程任务
pool.apply_async(dd_test, (round, th))
pool.close()
pool.join()
#等待线程完成
# for t in threads:
# t.join()
if mds_stat(round) == 0:
subprocess.call("zbkc -s",shell=True)
break
全部回答
(1) 用什么语言都不能证明逼格,包括汇编,也包括lisp/haskell。 (2) 在适当的场合用适当的工具,解除耦合、减少重复、易于扩展才是对逼格的更高挑战。 比如有一组件对数据库有大量操作,我同事认为他要用c++模板元编程加上一些巧妙的设计模式来生成sql是逼格高的体现,我认为在这样的场景下至少要用上orm才能谈得上对逼格有要求。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我的电脑蓝屏了,出现个 0×00000024 代码,
农村可以修建寺庙吗?
为什么我在CAD文件里面重新生成模型(就是Z/A
中兴广场(苏州昆山)地址有知道的么?有点事想
塔日巴音斯勃古图在什么地方啊,我要过去处理
吃中药能吃鸡吗
实际以无际可示,无生以不生相传 这是什么意
【蚶怎么读】“蚶”这个字怎么读?
姐妹酸菜鱼我想知道这个在什么地方
大宁购物广场(苏州昆山)地址在什么地方,我要
【dls是什么意思】...打印机装电脑上面安装驱
留云怎么去啊,有知道地址的么
一个包子大约多少克
百米钻机用的多路换向阀是哪种?
昆山万达广场地址在什么地方,我要处理点事
推荐资讯
【发了霉的橙子】怎样设计一个探究橙子发霉的
梦馨雅婚纱怎么去啊,我要去那办事
想知道: 南京市 文婧路 在哪
热电偶天燃气灶电磁阀热电偶怎么从电磁阀中拔
市场是某一产品所有()所组成的群体
有什么软件能打开所有格式的文件
高青县实验小学幼儿园怎么去啊,我要去那办事
为什么燃气灶和热水器同时打不着火,打开阀门
深圳福利彩票站点申请?
新阳的名字打多少分
factory的复数
开封市儿童医院我想知道这个在什么地方
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?