你的service是一个线程,只是一个线程
按照你的想法,你需要一个线程池threadPool
让你的service去拥有一个线程池
python有第三方线程池库
还有python的多线程不能利用多核CPU,除非阻塞IO,不然不要用多线程
序 multiprocessing
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
回到顶部
1 Process
创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group实质上不使用。
方法:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()启动某个进程。
属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为–N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新进程,必须在start()之前设置。
例11:创建函数并将其作为单个进程
import multiprocessingimport timedef worker(interval):
n = 5 while n > 0: print("The time is {0}"format(timectime()))
timesleep(interval)
n -= 1if __name__ == "__main__":
p = multiprocessingProcess(target = worker, args = (3,))
pstart() print "ppid:", ppid print "pname:", pname print "pis_alive:", pis_alive()
结果
12345678ppid: 8736pname: Process-1pis_alive: TrueThe time is Tue Apr 21 20:55:12 2015The time is Tue Apr 21 20:55:15 2015The time is Tue Apr 21 20:55:18 2015The time is Tue Apr 21 20:55:21 2015The time is Tue Apr 21 20:55:24 2015例12:创建函数并将其作为多个进程
import multiprocessingimport timedef worker_1(interval): print "worker_1"
timesleep(interval) print "end worker_1"def worker_2(interval): print "worker_2"
timesleep(interval) print "end worker_2"def worker_3(interval): print "worker_3"
timesleep(interval) print "end worker_3"if __name__ == "__main__":
p1 = multiprocessingProcess(target = worker_1, args = (2,))
p2 = multiprocessingProcess(target = worker_2, args = (3,))
p3 = multiprocessingProcess(target = worker_3, args = (4,))
p1start()
p2start()
p3start() print("The number of CPU is:" + str(multiprocessingcpu_count())) for p in multiprocessingactive_children(): print("child pname:" + pname + "\tpid" + str(ppid)) print "END!!!!!!!!!!!!!!!!!"
结果
1234567891011The number of CPU is:4child pname:Process-3 pid7992child pname:Process-2 pid4204child pname:Process-1 pid6380END!!!!!!!!!!!!!!!!!worker_1worker_3worker_2end worker_1end worker_2end worker_3任何一种编程语言,启动进程和关闭进程都是跟 *** 作系统相关的 *** 作,python中与 *** 作系统打交道的话,推荐使用os模块。
ossystem() 函数可以启动一个进程,执行完之后返回状态码。
osfork() 复制一个进程,如果是子进程返回0,如果是父进程返回子进程的pid,使用这个函数的时候,建议你学习一下linux编程的知识。
ospopen 以管道的方式创建进程。
osspawnl 也可以创建进程,并能指定环境变量。
oskill(pid, sig) 关闭一个进程,pid是进程号,sig是信号。与fork配合使用,例如你刚才用fork创建了一个子进程,它的pid是11990, 那么调用
oskill( 11990, signalCTRL_BREAK_EVENT)
就以ctrl+c的方式杀死了这个进程。
另外还有一个模块multiprocessing,这个模块封装了很多创建进程和进程间通信的 *** 作,可以让你发挥多核的威力。
通过pid,下面的procStatus() 在linux 系统查询进程pid 状态,z 代表僵死进程:
def procStatus(pid):for line in open("/proc/%d/status" % pid)readlines():
if linestartswith("State:"):
return linesplit(":",1)[1]strip()split(' ')[0]
return None
另外可以用 psutils:
import psutilp = psutilProcess(the_pid_you_want)
if pstatus == psutilSTATUS_ZOMBIE:
在利用Python进行系统管理的时候,特别是同时 *** 作多个文件目录,或者远程控制多台主机,并行 *** 作可以节约大量的时间。多进程是实现并发的手段之一,需要注意的问题是:
例如当被 *** 作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个。。。手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。
我们就可以通过维护一个进程池来控制进程数目,比如>
以上就是关于Python 进程全部的内容,包括:Python 进程、python进程能实现吗、python哪个函数启动进程和关闭进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)