进程数据共享

进程各自持有一份数据,默认无法共享数据

#!/usr/bin/env python

#coding:utf-8

from multiprocessing import Process

from multiprocessing import Manager

import time

li = []

def foo(i):

li.append(i)

print ‘say hi‘,li

for i in range(10):

p = Process(target=foo,args=(i,))

p.start()

print ‘ending‘,li

为了解决进程之间的数据共享问题,可以使用如下方法:

#方法一,Array

from multiprocessing import Process,Array

temp = Array(‘i‘, [11,22,33,44])

def Foo(i):

    temp[i] = 100+i

    for item in temp:

        print i,‘----->‘,item

for in range(2):

    = Process(target=Foo,args=(i,))

    p.start()

#方法二:manage.dict()共享数据

from multiprocessing import Process,Manager

manage = Manager()

dic = manage.dict()

def Foo(i):

    dic[i] = 100+i

    print dic.values()

for in range(2):

    = Process(target=Foo,args=(i,))

    p.start()

    p.join()

类型对应表:

 ‘c‘: ctypes.c_char,  ‘u‘: ctypes.c_wchar,   ‘b‘: ctypes.c_byte,  ‘B‘: ctypes.c_ubyte,     ‘h‘: ctypes.c_short, ‘H‘: ctypes.c_ushort,     ‘i‘: ctypes.c_int,   ‘I‘: ctypes.c_uint,     ‘l‘: ctypes.c_long,  ‘L‘: ctypes.c_ulong,     ‘f‘: ctypes.c_float, ‘d‘: ctypes.c_double

当创建进程时(非使用时),共享数据会被拿到子进程中,当进程中执行完毕后,再赋值给原值。

进程锁实例

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from multiprocessing import Process, Array, RLock

def Foo(lock,temp,i):

"""

将第0个数加100

"""

lock.acquire()

temp[0] = 100+i

for item in temp:

print i,‘----->‘,item

lock.release()

lock = RLock()

temp = Array(‘i‘, [11, 22, 33, 44])

for i in range(20):

p = Process(target=Foo,args=(lock,temp,i,))

p.start()

进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from  multiprocessing import Process,Pool

import time

 

def Foo(i):

    time.sleep(2)

    return i+100

 

def Bar(arg):

    print arg

 

pool = Pool(5)

#print pool.apply(Foo,(1,))

#print pool.apply_async(func =Foo, args=(1,)).get()

 

for in range(10):

    pool.apply_async(func=Foo, args=(i,),callback=Bar)

 

print ‘end‘

pool.close()

pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

时间: 2024-08-26 17:45:06

进程数据共享的相关文章

进程数据共享-进程池

数据共享 Manager  内部管理了很多数据类型,并不是所有的数据类型都是用来做数据分享,只是顺便包含了能够处理数据共享问题的数据类型 list dict 列表/字典  自带的方法基本都是数据安全的,但是对其中的元素进行+= -= *=  /=   都是数据不安全的 from multiprocessing import Manager,Process,Lock def func(dic,lock): with lock: dic['count'] -= 1 if __name__ == '_

3.3.3 进程数据共享

进程间数据交互 我们知道,两个独立进程所使用的内存空间也是独立的,不可交互的. 但现实中就有那么些情况需要两个进程可以互相通信,怎么办? 我们需要一个中继.翻译.中间人,不管你叫他什么,只要知道他是用来转发数据的就行了. Python中的这个中间人就叫queue,不是线程queue,是进程queue.使用方法和线程queue差不多. 示例如下: from multiprocessing import Process, Queue def f(q): q.put([42, None, 'Hello

第36篇 多进程的数据共享,进程池的回调函数,线程 什么是GIL锁,Threading模块记

内容概览: 进程 数据共享 进程池--回调函数 线程 线程的基础理论 什么是线程? 线程与进程的关系 GIL锁 线程的开启: Threading模块1,用多进程开启socket创建聊天 server端写了input函数会报错?因为服务器是高速运行的,自动化的为来访问的客户端提供服务, 不可能停下来等待管理员的输入,然后发送给客户.这就失去了自动化的意义. 2,进程池Pool()方法创建的进程,map()方法是否有返回值? p.map()得到的是迭代对象 import time from mult

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in

Python:简述 线程、进程和协程

Python线程 定义:Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def show(arg): time.sleep(1) print 'thread'+str(arg) for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start(

进程、线程

进程与线程 进程与线程的关系 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作的时候,创造并发操作 缺点:抢占资源 进程不是越多越好,cpu个数 = 进程个数 线程也不是越多越好,具体案例具体分析,请求上下文切换耗时 计算机中执行任务的最小单元:线程 IO操作利用cpu GIL 全局解释锁 IO密集型(不用cpu): 多线程 计算密集型(用cpu): 多进程 进程和线程的目的:提高执行效率1,截止目前写的程序:单进程单线

线程、进程和协程

Treading用于提供线程相关的操作,线程是应用程序中工作的最小单元 #!/usr/bin/env python # coding:utf-8 import threading import time def show(arg): time.sleep(1) print 'thread'+str(arg) for i in range(10): t = threading.Thread(target=show,args=(i,)) t.start() print 'main thread st

Python之线程与进程

1.程序 程序指的是指令的集合:程序不能单独的运行,必须将程序装载在内存中,系统给它分配资源才可以运行. 程序是进程动态运行的静态描述文本 2.进程 进程指的是程序在数据集中一次动态运行的过程: 3.线程 线程进程的最小执行单位,真正在CPU运行的是线程 4.进程与线程的关系 一个线程只能在一个进程里面,一个进程可以包含多个线程: 进程是资源管理单位(容器)  线程是最小执行单位 5.并行与并发 并行:指的是同时处理多个任务(多个线程被不同的CPU执行) 并发:指的是交替处理多个任务(多个线程被

【Python学习之路】——Day10(线程、进程)

Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def show(arg): time.sleep(1) print 'thread'+str(arg) for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start() p