gpt4 book ai didi

python - 在两个线程进程之间访问数据

转载 作者:行者123 更新时间:2023-12-01 05:12:48 25 4
gpt4 key购买 nike

我们正在尝试访问两个线程之间的数据,但无法完成此操作。我们正在寻找一种简单(且优雅)的方法。

这是我们当前的代码。目标:第二个线程/进程完成后,实例 B 中的 listHolder 必须包含 2 个项目。

Class A:
self.name = "MyNameIsBlah"

Class B:
# Contains a list of A Objects. Is now empty.
self.listHolder = []

def add(self, obj):
self.listHolder.append(obj)

def remove(self, obj):
self.listHolder.remove(obj)

def process(list):
# Create our second instance of A in process/thread
secondItem = A()
# Add our new instance to the list, so that we can access it out of our process/thread.
list.append(secondItem)

# Create new instance of B which is the manager. Our listHolder is empty here.
manager = B()

# Create new instance of A which is our first item
firstItem = A()

# Add our first item to the manager. Our listHolder now contains one item now.
b.add(firstItem)

# Start a new seperate process.
p = Process(target=process, args=manager.listHolder)

# Now start the thread
p.start()

# We now want to access our second item here from the listHolder, which was initiated in the seperate process/thread.

print len(manager.listHolder) << 1
print manager.listHolder[1] << ERROR
  • 预期输出:listHolder 中有 2 个 A 实例。
  • 得到输出:listHolder 中的 1 A 实例。

我们如何使用单独的进程/线程来访问管理器中的对象,以便它们可以以非线程阻塞的方式同时运行两个函数。

目前我们正在尝试通过进程来实现这一目标,但如果线程可以以更简单的方式实现这一目标,那么这不是问题。使用Python 2.7。

更新1:

@James Mills 使用“.join()”回复。但是,这将阻塞主线程,直到第二个进程完成为止。我尝试使用它,但是本示例中使用的进程永远不会停止执行(当 True 时)。它将充当计时器,必须能够迭代列表从列表中删除对象

有人对如何完成此任务并修复当前的 cPickle 错误有任何建议吗?

最佳答案

如果 James Mills 的答案对您不起作用,这里有一篇有关如何使用队列显式地将数据来回发送到工作进程的文章:

#!/usr/bin/env python

import logging, multiprocessing, sys


def myproc(arg):
return arg*2

def worker(inqueue, outqueue):
logger = multiprocessing.get_logger()
logger.info('start')
while True:
job = inqueue.get()
logger.info('got %s', job)
outqueue.put( myproc(job) )

def beancounter(inqueue):
while True:
print 'done:', inqueue.get()

def main():
logger = multiprocessing.log_to_stderr(
level=logging.INFO,
)
logger.info('setup')

data_queue = multiprocessing.Queue()
out_queue = multiprocessing.Queue()

for num in range(5):
data_queue.put(num)

worker_p = multiprocessing.Process(
target=worker, args=(data_queue, out_queue),
name='worker',
)
worker_p.start()

bean_p = multiprocessing.Process(
target=beancounter, args=(out_queue,),
name='beancounter',
)
bean_p.start()

worker_p.join()
bean_p.join()
logger.info('done')


if __name__=='__main__':
main()

来自:Django multiprocessing and empty queue after put

使用多处理管理器处理数据的另一个示例如下:

http://johntellsall.blogspot.com/2014/05/code-multiprocessing-producerconsumer.html

关于python - 在两个线程进程之间访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23831559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com