当前位置: 首页 > 面试题库 >

Spyder中的简单Python多重处理功能不会输出结果

印曜灿
2023-03-14
问题内容

我在这里有一个非常简单的函数,试图在其中运行和测试,但是它不输出任何东西,也没有任何错误。我已经多次检查代码,但没有任何错误。

我打印了工作,这是我得到的:

[<Process(Process-12, stopped[1])>, 
<Process(Process-13, stopped[1])>,
<Process(Process-14, stopped[1])>, 
<Process(Process-15, stopped[1])>,
<Process(Process-16, stopped[1])>]

这是代码:

import multiprocessing

def worker(num):
    print "worker ", num
    return

jobs = []
for i in range(5):
    p = multiprocessing.Process(target = worker, args = (i,))
    jobs.append(p)
    p.start()

这是我期望的结果,但未输出任何内容:

Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4

问题答案:

评论显示OP和Spyder都使用Windows。由于Spyder重定向stdout并且Windows不支持分支,因此新的子进程将不会打印到Spyder控制台中。这完全是由于stdout新的子进程是Python的香草标准输出,也可以在中找到sys.__stdout__

有两种选择:

  1. 使用日志记录模块。这将包括创建所有消息并将其记录到一个或几个文件中。使用单个日志文件可能会导致以下问题:由于进程将同时写入文件,因此输出会出现一些乱码。每个进程使用一个文件可以解决此问题。

  2. 不在print子进程中使用,而只是将结果返回给主进程。通过使用队列(或multiprocessing.Manager().Queue()因为不可能进行分叉)或更简单地依靠多处理池的 map功能,请参见下面的示例。

带有池的多处理示例:

import multiprocessing

def worker(num):
    """Returns the string of interest"""
    return "worker %d" % num

def main():
    pool = multiprocessing.Pool(4)
    results = pool.map(worker, range(10))

    pool.close()
    pool.join()

    for result in results:
        # prints the result string in the main process
        print(result)

if __name__ == '__main__':
    # Better protect your main function when you use multiprocessing
    main()

哪个打印(在主要过程中)

worker 0
worker 1
worker 2
worker 3
worker 4
worker 5
worker 6
worker 7
worker 8
worker 9

编辑:如果您不耐烦地等待map函数完成,则可以通过使用imap_unordered命令并稍微更改命令的顺序来立即打印结果:

def main():
    pool = multiprocessing.Pool(4)
    results = pool.imap_unordered(worker, range(10))

    for result in results:
        # prints the result string in the main process as soon as say are ready
        # but results are now no longer in order!
        print(result)

    # The pool should join after printing all results
    pool.close()
    pool.join()


 类似资料:
  • 我已经在处理中编写了一个算法来执行以下操作: 由于某种原因,这个算法会立即冻结。我在里面放了打印语句,显示它甚至在试图加载图像之前就冻结了。考虑到我已经编写了另一个非常相似的算法,并且执行起来没有并发症,这让我特别困惑。另一种算法读取图像,对指定大小的每块瓷砖的颜色取平均值,然后在用平均颜色取平均值的区域上打印矩形,有效地使图像像素化。两种算法都加载图像并检查其每个像素。这个算法的主要区别在于它没

  • 问题内容: 我正在尝试遵循一个非常简单的多处理示例: 但是,在我的Windows机器上,我无法获得结果(在ubuntu 12.04LTS上,它运行正常)。 如果我检查,则会看到以下内容: 如果我跑步,我总能得到。 如果我运行python解释器冻结,则等待获取永远不会出现的结果。 该示例非常简单,因此我认为这是与OS相关的低级错误(我在Windows 7上)。但是也许其他人有更好的主意? 问题答案:

  • 问题内容: 尝试学习python时遇到了这个问题。考虑以下功能: s1和s2将打印什么? 运行该问题后,我发现print语句将打印12。似乎s1和s2的值未从函数中更改。我能想到的唯一解释是因为线条。 由于s1 [:]是一个副本,因此有道理s1的值在函数调用中不会改变。但是,因为的参数是(s1,s2),所以不确定tmp = s1 [:]之后是否。每当我做 它是对s1副本的引用,而不是s1本身。有人

  • 本文向大家介绍C++ HLSL实现简单的图像处理功能,包括了C++ HLSL实现简单的图像处理功能的使用技巧和注意事项,需要的朋友参考一下 由于对于dxva2解码得到的数据不宜copy回内存给CPU处理,所以最好的办法是在GPU上直接进行处理。D3D的像素着色器能够对像素直接进行操作,实现点运算极其简单方便,简单的卷积运算效果也非常好。但D3D9的限制也很多,对于过于复杂的图像处理则显得有些不能胜

  • 我一直在尝试从 kafka 流式传输我的 json 事件,将其展平,然后使用 Spring Cloud 流将其推送回另一个主题。 输入: 压平工艺: 仅产生: 我的问题是怎么让它变成这样 所以我可以像我所做的那样推回残缺的 JSONObject 而不是单个 JSONArray? 尽管如此,Spring Cloud Stream输出只是一个单独的事件,不适合我上面的案例,无法为Kafka生成3个事件

  • 问题内容: 我有非常简单的案例,可以将要完成的工作分解并分配给工人。我从这里尝试了一个非常简单的多处理示例: 上面的程序产生以下输出: 为什么要打印相同的随机数?(我的机器上有4个CPU)。这是最好/最简单的方法吗? 问题答案: 我认为您需要在函数中使用numpy.random.seed重新设置随机数生成器。 我的猜测是,当您导入模块时,随机数生成器(RNG)会被植入种子。然后,当您使用多处理时,