GVKun编程网logo

在python多处理中修改对象(python中可以修改的对象)

18

最近很多小伙伴都在问在python多处理中修改对象和python中可以修改的对象这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Flask中的Python多处理、python多处理

最近很多小伙伴都在问在python多处理中修改对象python中可以修改的对象这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Flask中的Python多处理、python多处理中的共享变量不起作用、python多处理产量量子、Python多处理传递引用等相关知识,下面开始了哦!

本文目录一览:

在python多处理中修改对象(python中可以修改的对象)

在python多处理中修改对象(python中可以修改的对象)

我有很多自定义对象,需要对其执行独立(可并行化)的任务,包括修改对象参数。我试过同时使用Manager()。dict和’sharedmem’ory,但都没有用。例如:

import numpy as npimport multiprocessing as mpimport sharedmem as shmclass Tester:    num = 0.0    name = ''none''    def __init__(self,tnum=num, tname=name):        self.num  = tnum        self.name = tname    def __str__(self):        return ''%f %s'' % (self.num, self.name)def mod(test, nn):    test.num = np.random.randn()    test.name = nnif __name__ == ''__main__'':    num = 10    tests = np.empty(num, dtype=object)    for it in range(num):        tests[it] = Tester(tnum=it*1.0)    sh_tests = shm.empty(num, dtype=object)    for it in range(num):        sh_tests[it] = tests[it]        print sh_tests[it]    print ''\n''    workers = [ mp.Process(target=mod, args=(test, ''some'') ) for test in sh_tests ]    for work in workers: work.start()    for work in workers: work.join()    for test in sh_tests: print test

打印出:

0.000000 none1.000000 none2.000000 none3.000000 none4.000000 none5.000000 none6.000000 none7.000000 none8.000000 none9.000000 none0.000000 none1.000000 none2.000000 none3.000000 none4.000000 none5.000000 none6.000000 none7.000000 none8.000000 none9.000000 none

即对象没有被修改。

如何实现所需的行为?

答案1

小编典典

问题在于,当将对象传递给工作进程时,它们会被泡菜包装,运送到另一个过程中,然后在其中解压缩并进行处理。您的对象没有像克隆的那样传递给其他过程。您不返回对象,因此克隆的对象被愉快地修改,然后被丢弃。

看起来这是无法完成的(Python:可以在两个单独的进程之间共享内存中的数据)。

您可以做的就是返回修改后的对象。

import numpy as npimport multiprocessing as mpclass Tester:    num = 0.0    name = ''none''    def __init__(self,tnum=num, tname=name):        self.num  = tnum        self.name = tname    def __str__(self):        return ''%f %s'' % (self.num, self.name)def mod(test, nn, out_queue):    print test.num    test.num = np.random.randn()    print test.num    test.name = nn    out_queue.put(test)if __name__ == ''__main__'':           num = 10    out_queue = mp.Queue()    tests = np.empty(num, dtype=object)    for it in range(num):        tests[it] = Tester(tnum=it*1.0)    print ''\n''    workers = [ mp.Process(target=mod, args=(test, ''some'', out_queue) ) for test in tests ]    for work in workers: work.start()    for work in workers: work.join()    res_lst = []    for j in range(len(workers)):        res_lst.append(out_queue.get())    for test in res_lst: print test

这的确引起了一个有趣的观察,因为产生的过程是相同的,所以对于随机数它们都以相同的种子开始,因此它们 产生相同的“随机”数。

Flask中的Python多处理

Flask中的Python多处理

这个问题可能已经有人提出过,而且回答的可能性更大,但是我不知道在哪里可以找到它。

问题:我有一个用于pythonflask的路由器,该路由器需要花费一些时间来处理每个调用的数据。我需要使对路由的每个调用本身就是一个线程,因此它不必等待请求被加载。

答案1

小编典典

Flask带有内置的开发Web服务器,但是你不应该在生产环境中使用它。

为了获得一些很酷的功能,例如为每个请求和静态文件服务提供单独的进程,你需要在Flask应用程序前面运行实际的Web服务和WSGI服务。

Flask文档提供了一些有关如何进行设置的示例。流行的Web Server / WSGI组合是Apache / mod_wsgi和Nginx / Gunicorn,但是还有许多其他选择。

python多处理中的共享变量不起作用

python多处理中的共享变量不起作用

如何解决python多处理中的共享变量不起作用?

我想在学校为我的项目使用多处理,但我在多个进程之间共享变量时遇到问题。为了模拟这个问题,我做了一些代码给你看:

import multiprocessing
import ctypes
import time


def function1():
    global value

    while True:
        value.value += 1
        time.sleep(1)


def function2():
    global value

    while True:
        value.value += 1
        time.sleep(1)


if __name__ == "__main__":
    manager = multiprocessing.Manager()
    value = manager.Value("i",0)

    process1 = multiprocessing.Process(target=function1)
    process2 = multiprocessing.Process(target=function2)
    process1.start()
    process2.start()

    while True:
        print(value.value)
        time.sleep(1)

这是我收到的错误消息:

NameError: name ''value'' is not defined

有人可以帮我吗? 谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

python多处理产量量子

python多处理产量量子

如何解决python多处理产量量子?

我想通过使用 python 多处理库在我的程序中使用并行化。为此,我想检查一个动作现在是否正确可行,如果不能产生当前进程的量,并允许下一个进程利用 cpu 时间,直到调度程序决定再试一次。

通过搜索我发现 time.sleep(0) 似乎是为线程做的。它也适用于流程吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Python多处理传递引用

Python多处理传递引用

我正在尝试使用多处理模块在进程之间传递自定义队列.问题是我没有把所有的方法都传到另一边.根据文件.

A proxy object has methods which invoke corresponding methods of its referent (although not every method of the referent will necessarily be available through the proxy). A proxy can usually be used in most of the same ways that its referent can

但它没有说明原因或解决方法.我想知道是否有人知道这样做的方法.

这是我正在尝试做的一个小例子.

服务器:

from multiprocessing.managers import BaseManager
from Queue import Queue


class KeyHandler(Queue):

    def __init__(self,elements=[]):
        Queue.__init__(self)

        for element in elements:
            self.put(element)

    def __iter__(self):
        return iter(self.get,object())

    def __call__(self):
        return self


class QueueManager(BaseManager):
    pass

keyhandler = KeyHandler(range(10))


QueueManager.register(''keyhandler'',callable=keyhandler)
manager = QueueManager(address=('''',50000),authkey=''foobar'')
server  = manager.get_server()
server.serve_forever()

客户:

from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
    pass


QueueManager.register(''keyhandler'')
manager = QueueManager(address=('''',authkey=''foobar'')
manager.connect()

keyhandler = manager.keyhandler()

for elem in keyhandler:
    print elem

追溯:

Traceback (most recent call last):
  File "client2.py",line 14,in <module>
    for elem in keyhandler:
TypeError: ''Autoproxy[keyhandler]'' object is not iterable

__call__方法有效,但__iter__方法不起作用.我可以以某种方式强迫/解决这个问题吗?

解决方法

使用代理服务器.在客户端添加此类声明(以及导入BaseProxy):

class KeyHandlerProxy(BaseProxy):
    _exposed_ = (''next'',''get'')

    def __iter__(self):
        return self

    def next(self):
        o = self._callmethod(''get'')
        if object() == o:
            raise stopiteration
        return o

并将寄存器(客户端)更改为:

QueueManager.register(''keyhandler'',proxytype=KeyHandlerProxy)

关于在python多处理中修改对象python中可以修改的对象的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Flask中的Python多处理、python多处理中的共享变量不起作用、python多处理产量量子、Python多处理传递引用的相关信息,请在本站寻找。

本文标签: