相关疑难解决方法(0)

ProcessPoolExecutor日志记录无法在Windows上记录内部函数,但在Unix/Mac上无法记录

当我在Windows计算机上运行以下脚本时,我没有看到该log_pid函数的任何日志消息,但是当我在Unix/Mac上运行时,我会这样做.我之前已经读过,与Mac相比,Windows上的多处理方式不同,但我不清楚应该做些什么更改才能让这个脚本在Windows上运行.我正在运行Python 3.6.

import logging
import sys
from concurrent.futures import ProcessPoolExecutor
import os


def log_pid(x):
    logger.info('Executing on process: %s' % os.getpid())


def do_stuff():
    logger.info('this is the do stuff function.')
    with ProcessPoolExecutor(max_workers=4) as executor:
        executor.map(log_pid, range(0, 10))


def main():
    logger.info('this is the main function.')
    do_stuff()


if __name__ == '__main__':
    logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
    logger = logging.getLogger(__name__)

    logger.info('Start of script ...')

    main()

    logger.info('End of script ...')
Run Code Online (Sandbox Code Playgroud)

python multiprocessing concurrent.futures

6
推荐指数
1
解决办法
809
查看次数

多处理事件不起作用

我使用多处理模块在 Python 3 中编写了以下代码。它更多的是一个测试脚本,看看如何使用Event. 但是,它不起作用。

import multiprocessing, time

from multiprocessing import Process, Event

event = Event()

def f(n):

    if n == 1:

        print("starting")

        event.wait()

        print("Done!")


    if n == 2:

        time.sleep(3)

        event.set()

        print("setting")

if __name__ == "__main__":

    p1 = Process(target = f, args = (1,))
    p2 = Process(target = f, args = (2,))

    p1.start()

    p2.start()

    time.sleep(1000)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这个时,我只得到输出:

starting
setting
Run Code Online (Sandbox Code Playgroud)

我想得到输出:

starting
setting
Done!
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,p1在进程调用 event.set() 后,进程没有继续执行其代码p2

有什么想法为什么会发生这种情况吗?

python events multiprocessing

5
推荐指数
1
解决办法
4347
查看次数

为什么多处理池映射与串行映射相比没有加速?

我有这个非常简单的python代码,我希望通过并行化来加速它.然而,无论我做什么,multiprocessing.Pool.map都不会在标准地图上获得任何东西.

我已经读过其他线程,其中人们使用这个非常小的函数,这些函数不能很好地并行化并导致过多的开销,但我认为这不应该是这种情况.

难道我做错了什么?

这是一个例子

#!/usr/bin/python

import numpy, time

def AddNoise(sample):
    #time.sleep(0.001)
    return sample + numpy.random.randint(0,9,sample.shape)
    #return sample + numpy.ones(sample.shape)

n=100
m=10000
start = time.time()
A = list([ numpy.random.randint(0,9,(n,n)) for i in range(m) ])
print("creating %d numpy arrays of %d x %d took %.2f seconds"%(m,n,n,time.time()-start))

for i in range(3):
    start = time.time()
    A = list(map(AddNoise, A))
    print("adding numpy arrays took %.2f seconds"%(time.time()-start))

for i in range(3):
    import multiprocessing
    start = time.time()
    with multiprocessing.Pool(processes=2) as pool:
        A = list(pool.map(AddNoise, A, …
Run Code Online (Sandbox Code Playgroud)

python numpy pool multiprocessing python-3.x

0
推荐指数
1
解决办法
512
查看次数