当前位置: 首页 > news >正文

网站建设平台网站设计/如何自己开发一个网站

网站建设平台网站设计,如何自己开发一个网站,中国制造加工网官网,梵克雅宝官网中国官方网我正在启动3个进程,我希望它们在与进程(i)对应的索引处将字符串放入共享数组中.看下面的代码,生成的输出是:[test 0, None, None][test 1, test 1, None][test 2, test 2, test 2]为什么’测试0’被测试1覆盖,测试1被测试2覆盖?我想要的是(顺序并不重要)…

我正在启动3个进程,我希望它们在与进程(i)对应的索引处将字符串放入共享数组中.

看下面的代码,生成的输出是:

['test 0', None, None]

['test 1', 'test 1', None]

['test 2', 'test 2', 'test 2']

为什么’测试0’被测试1覆盖,测试1被测试2覆盖?

我想要的是(顺序并不重要):

['test 0', None, None]

['test 0', 'test 1', None]

['test 0', 'test 1', 'test 2']

代码 :

#!/usr/bin/env python

import multiprocessing

from multiprocessing import Value, Lock, Process, Array

import ctypes

from ctypes import c_int, c_char_p

class Consumer(multiprocessing.Process):

def __init__(self, task_queue, result_queue, arr, lock):

multiprocessing.Process.__init__(self)

self.task_queue = task_queue

self.result_queue = result_queue

self.arr = arr

self.lock = lock

def run(self):

proc_name = self.name

while True:

next_task = self.task_queue.get()

if next_task is None:

self.task_queue.task_done()

break

answer = next_task(arr=self.arr, lock=self.lock)

self.task_queue.task_done()

self.result_queue.put(answer)

return

class Task(object):

def __init__(self, i):

self.i = i

def __call__(self, arr=None, lock=None):

with lock:

arr[self.i] = "test %d" % self.i

print arr[:]

def __str__(self):

return 'ARC'

def run(self):

print 'IN'

if __name__ == '__main__':

tasks = multiprocessing.JoinableQueue()

results = multiprocessing.Queue()

arr = Array(ctypes.c_char_p, 3)

lock = multiprocessing.Lock()

num_consumers = multiprocessing.cpu_count() * 2

consumers = [Consumer(tasks, results, arr, lock) for i in xrange(num_consumers)]

for w in consumers:

w.start()

for i in xrange(3):

tasks.put(Task(i))

for i in xrange(num_consumers):

tasks.put(None)

我正在运行Python 2.7.3(Ubuntu)

解决方法:

这个问题看起来与this one类似.在那里,J.F.Sebastian推测arr [i]的赋值将arr [i]指向一个只对进行赋值的子进程有意义的内存地址.其他子进程在查看该地址时检索垃圾.

至少有两种方法可以避免这个问题.一种是使用multiprocessing.manager列表:

import multiprocessing as mp

class Consumer(mp.Process):

def __init__(self, task_queue, result_queue, lock, lst):

mp.Process.__init__(self)

self.task_queue = task_queue

self.result_queue = result_queue

self.lock = lock

self.lst = lst

def run(self):

proc_name = self.name

while True:

next_task = self.task_queue.get()

if next_task is None:

self.task_queue.task_done()

break

answer = next_task(lock = self.lock, lst = self.lst)

self.task_queue.task_done()

self.result_queue.put(answer)

return

class Task(object):

def __init__(self, i):

self.i = i

def __call__(self, lock, lst):

with lock:

lst[self.i] = "test {}".format(self.i)

print([lst[i] for i in range(3)])

if __name__ == '__main__':

tasks = mp.JoinableQueue()

results = mp.Queue()

manager = mp.Manager()

lst = manager.list(['']*3)

lock = mp.Lock()

num_consumers = mp.cpu_count() * 2

consumers = [Consumer(tasks, results, lock, lst) for i in xrange(num_consumers)]

for w in consumers:

w.start()

for i in xrange(3):

tasks.put(Task(i))

for i in xrange(num_consumers):

tasks.put(None)

tasks.join()

另一种方法是使用具有固定大小的共享数组,例如mp.Array(‘c’,10).

import multiprocessing as mp

class Consumer(mp.Process):

def __init__(self, task_queue, result_queue, arr, lock):

mp.Process.__init__(self)

self.task_queue = task_queue

self.result_queue = result_queue

self.arr = arr

self.lock = lock

def run(self):

proc_name = self.name

while True:

next_task = self.task_queue.get()

if next_task is None:

self.task_queue.task_done()

break

answer = next_task(arr = self.arr, lock = self.lock)

self.task_queue.task_done()

self.result_queue.put(answer)

return

class Task(object):

def __init__(self, i):

self.i = i

def __call__(self, arr, lock):

with lock:

arr[self.i].value = "test {}".format(self.i)

print([a.value for a in arr])

if __name__ == '__main__':

tasks = mp.JoinableQueue()

results = mp.Queue()

arr = [mp.Array('c', 10) for i in range(3)]

lock = mp.Lock()

num_consumers = mp.cpu_count() * 2

consumers = [Consumer(tasks, results, arr, lock) for i in xrange(num_consumers)]

for w in consumers:

w.start()

for i in xrange(3):

tasks.put(Task(i))

for i in xrange(num_consumers):

tasks.put(None)

tasks.join()

我推测当mp.Array(ctypes.c_char_p,3)没有这个时,这是因为mp.Array(‘c’,10)有一个固定的大小,所以内存地址永远不会改变,而mp.Array( ctypes.c_char_p,3)具有可变大小,因此当arr [i]被分配给更大的字符串时,内存地址可能会改变.

也许这就是the docs在发表声明时所发出的警告,

Although it is possible to store a pointer in shared memory remember

that this will refer to a location in the address space of a specific

process. However, the pointer is quite likely to be invalid in the

context of a second process and trying to dereference the pointer from

the second process may cause a crash.

标签:python,multiprocessing,ctypes

来源: https://codeday.me/bug/20190520/1143705.html

http://www.lbrq.cn/news/1351513.html

相关文章:

  • 网上书店网站建设实训总结/如何制作自己的公司网站
  • 重庆网站关键词优化推广/推广下载
  • ps制作博客网站界面/最好用的搜索神器
  • 邢台专业网站建设公司推荐/企业专业搜索引擎优化
  • 做公众号的网站模板下载吗/搜狗收录提交入口网址
  • 做网站的的价格/谷歌seo外包
  • 山西移动网站设计/如何推广好一个产品
  • 网站从哪些方面来做/武汉官网优化公司
  • 淄博 做网站/吴江seo网站优化软件
  • 开发网站 要网站icp经营许可证吗/2024年2月疫情又开始了吗
  • 织梦做的相亲网站/seo快照推广
  • 做网站要的图片斗鱼/宁波seo哪家好
  • 四川兴昌建设有限公司网站/全自动推广引流软件
  • 万网域名怎样把淘宝网站加进去/长春网站制作推广
  • 平度那里有做网站的/自主建站
  • 一般通过山女是什么梗/优化大师官方正版下载
  • 什么网站可以做高三英语试题/网络营销推广方式包括哪几种
  • 企业官网的重要性/成都网站seo诊断
  • 工信部清理未备案网站/最新seo自动优化软件
  • 网站设计中的js/网盘搜索引擎
  • 新民企业自助建站/北京疫情发布不再公布各区数据
  • 未来做啥网站能致富/互联网产品运营
  • 团购汽车最便宜的网站建设/谷歌安装器
  • 微信小程序制作软件下载/宁波seo推广外包公司
  • 网页设计与网站建设试题/培训心得体会范文500字
  • 自己做的网站微信pc端显示乱码/重庆高端网站seo
  • 网站建设怎么弄/网络平台推广方案
  • 自己可以接单做网站吗/企业网络营销策略分析案例
  • 网站建设过程中的通用原则/网站设计是做什么的
  • 起点数据网是谁做的网站/搜索引擎推广的方法有哪些
  • 【插件式微服务架构系统分享】之 解耦至上:gateway 网关与APISIX 网关的不同分工
  • DAY33打卡
  • 【网络基础】计算机网络发展背景及传输数据过程介绍
  • 【科研绘图系列】R语言绘制瀑布图
  • 暑期算法训练.14
  • Vue3 defineAsyncComponent() 函数