Python的多进程编程

考虑到多线程,都在一个主进程中共享栈变量,在操作同一个局部变量时可能出现絮乱的现象,即使加锁也容易出现死锁的现象,小编在这里再次记录下多进程编程,废话不多说,直接上代码:

#!/usr/bin/env python
#encoding: utf-8  

import multiprocessing
import time

def process_one(interval):
    n =5
    while n >0:
        print ("the time is {0}".format(time.ctime()))
        time.sleep(interval)
        n -= 1

if __name__=="__main__":
    process_test = multiprocessing.Process(target = process_one,args = (2,))
    process_test.start()
    print "process_test.pid:", process_test.pid
    print "process_test.name:",process_test.name
    print "process_test.is_alive",process_test.is_alive()

在命令行运行结果:

C:\Python27>python mul_process.py
process_test.pid: 88492
process_test.name: Process-1
process_test.is_alive True
the time is Sun Jul 16 19:38:24 2017
the time is Sun Jul 16 19:38:26 2017
the time is Sun Jul 16 19:38:28 2017
the time is Sun Jul 16 19:38:30 2017
the time is Sun Jul 16 19:38:32 2017

同时开启3个进程:

#!/usr/bin/env python
#encoding: utf-8  

import multiprocessing
import time

def process_one(interval):
    time.sleep(interval)
    print "start process_one\n"
    print ("process_one work time is {0}\n".format(time.ctime()))
    print "end process_one\n"

def process_two(interval):
    time.sleep(interval)
    print "start process_two\n"
    print ("process_two work time is {0}\n".format(time.ctime()))
    print "end process_two\n"

def process_three(interval):
    time.sleep(interval)
    print "start process_three\n"
    print ("process_three work time is {0}\n".format(time.ctime()))
    print "end process_three\n"

if __name__=="__main__":
    process_test_1 = multiprocessing.Process(target = process_one,args = (1,))
    process_test_2 = multiprocessing.Process(target = process_two,args = (2,))
    process_test_3 = multiprocessing.Process(target = process_three,args = (3,))

    process_test_1.start()
    process_test_2.start()
    process_test_3.start()

    print "the number of CPU is :"+str(multiprocessing.cpu_count())+"\n"
    for p in multiprocessing.active_children():
        print "child p.name "+p.name+"\np.id "+ str(p.pid)+"\n"
    print "end!!!!!!!!!!!!!!"

运行结果:

C:\Python27>python mul_process.py
the number of CPU is :2

child p.name Process-3
p.id 101572

child p.name Process-2
p.id 101420

child p.name Process-1
p.id 99852

end!!!!!!!!!!!!!!
start process_one

process_one work time is Sun Jul 16 20:05:07 2017

end process_one

start process_two

process_two work time is Sun Jul 16 20:05:08 2017

end process_two

start process_three

process_three work time is Sun Jul 16 20:05:09 2017

end process_three

将进程封装为类:

#!/usr/bin/env python
#encoding: utf-8  

import multiprocessing
import time

class ClockProcess(multiprocessing.Process):
    def __init__(self,interval):
        multiprocessing.Process.__init__(self)
        self.interval = interval

    def run(self):
        n=5
        while n>0:
            print "the time is {0}".format(time.ctime())
            time.sleep(self.interval)
            n -= 1

if __name__=="__main__":
    process_test_1 = ClockProcess(2)
    process_test_1.start()
    

温馨提示:进程p调用start()时,自动调用run()

运行结果:

C:\Python27>python mul_process.py
the time is Sun Jul 16 20:11:59 2017
the time is Sun Jul 16 20:12:01 2017
the time is Sun Jul 16 20:12:03 2017
the time is Sun Jul 16 20:12:05 2017
the time is Sun Jul 16 20:12:07 2017

探究daemon程序对比结果

#!/usr/bin/env python
#encoding: utf-8  

import multiprocessing
import time

def process_one(interval):
    print "process_one start time :{0}".format(time.ctime())
    time.sleep(interval)
    print "process_one end time :{0}".format(time.ctime())

if __name__=="__main__":
    process_test = multiprocessing.Process(target = process_one,args = (2,))
    process_test.daemon = True
    process_test.start()
    print "end!!!!!!!!!!!!!!!"

执行结果:

C:\Python27>python mul_process.py
end!!!!!!!!!!!!!!!

怎么回事???开启的进程怎么没有运行?

:因子进程设置了daemon属性,主进程结束,它们就随着结束了

#!/usr/bin/env python
#encoding: utf-8  

import multiprocessing
import time

def process_one(interval):
    print "process_one start time :{0}".format(time.ctime())
    time.sleep(interval)
    print "process_one end time :{0}".format(time.ctime())

if __name__=="__main__":
    process_test = multiprocessing.Process(target = process_one,args = (2,))
    process_test.daemon = True
    process_test.start()
    process_test.join()
    print "end!!!!!!!!!!!!!!!"

运行结果:

提示这里跟多线程相似

C:\Python27>python mul_process.py
process_one start time :Sun Jul 16 20:21:34 2017
process_one end time :Sun Jul 16 20:21:36 2017
end!!!!!!!!!!!!!!!

今天暂时写到这儿,调试 程序遇到一点问题

原因大致如下,因为我的程序是在Windows运行的,待代码在linux上跑通之后再更新

In Windows, multiprocessing uses pickle to transfer objects between processes. Socket objects can not be pickled, hence the problem that you see.

Your code does work in Linux, and that is because multiprocessing uses fork on that platform. The child of a forked process inherits the parent‘s file handles, of which one is the socket.

时间: 2024-10-12 18:01:53

Python的多进程编程的相关文章

Python 3 并发编程多进程之队列(推荐使用)

Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往队列里放任意类型的数据 创建队列的类(底层就是以管道和锁定的方式实现): 1 Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. 参数介绍: 1 maxsize是队列中允许最大项数,省略则无大小限制. 方法介绍: 1.主要

Python 3 并发编程多进程之进程同步(锁)

Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1.多个进程共享同一打印终端 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.g

python使用multiprocessing进行多进程编程(1)

multiprocessing模块实现了对多进程编程的封装,让我们可以非常方便的使用多进程进行编程.它的使用方法非常类似threading模块. 1.创建一个进程 import multiprocessing def worker(): """worker function""" print 'Worker' return if __name__ == '__main__': jobs = [] for i in range(5): p = mu

python 使用多进程实现并发编程/使用queue进行进程间数据交换

import time import os import multiprocessing from multiprocessing import Queue, pool """ 一.Python 使用多进程实现并发编程: 因为cpython解释器中有GIL存在的原因(每个进程都会维护一个GIL,jpython解释器没有这个问题),所以在一个进程内, 即使服务器是多核cpu,同一时刻只能有一个线程在执行任务(一个进程内).如果存在较多IO,使用多线程是可以提高处理速度的, 但是

python中的多线程和多进程编程

注意:多线程和多线程编程是不同的!!! 第一点:一个进程相当于一个要执行的程序,它会开启一个主线程,多线程的话就会再开启多个子线程:而多进程的话就是一个进程同时在多个核上进行: 第二点:多线程是一种并发操作(伪并行),它相当于把CPU的时间片分成一段一段很小的片段,然后分给各个线程交替进行,由于每个片段都很短,所以看上去像平行操作: (1)多线程操作案例: import threading class MyThread(threading.Thread): def __init__(self ,

python --- mulitprocessing(多进程)模块使用

1. 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器. 一个进程至少包含一个线程. 2. 在python中有了多线程编程为何还需要多进程编程? 在python中由于有GIL(全局解释器锁)的存在,在任一时刻只有一个线程在运行(无论你的CPU是多少核),无法实现真正的多线程.那么该如何让pyth

[记录]Python高并发编程

========== ==多进程== ========== 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回. 子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,

Python中多进程的使用

进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的线程有一个程序入口,顺序执行序列和程序的出口. 线程的运行可以被强占,中断或者暂时被挂起(睡眠),让其他的线程运行.一个进程中的各个线程共享同一片数据空间. python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了

Python多线程多进程那些事儿看这篇就够了~~

自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块. 目录   0x01 进程 and 线程 and “GIL” 0x02 python多线程&&线程锁&&threading类 0x03 python队列代码实现 0x04 python之线程池实现 0x05 python多进程并行实现 0x01 进程 and 线程 and “