Почему многопроцессорная обработка Python. Queue не блокирует - PullRequest
0 голосов
/ 22 декабря 2018

Я новичок в Python, но я хочу написать многопроцессорную программу, которая использует multiprocessing.Queue в качестве канала Go.Однако, похоже, что multiprocessing.Queue.put(, block=True) не блокируется, поскольку задокументировано .

Вот мой пример программы на Python:

import multiprocessing
import select
import time


def f(q):
    while True:
        time.sleep(1)
        print("Put")
        q.put("hello world")


if __name__ == "__main__":
    q = multiprocessing.Queue(maxsize=0)
    f(q)

Я ожидаю, что она будет печатать толькоодин «положил» и блокирует навсегда.Однако, я понял, что он печатает «Put» несколько раз.

Вот программа Go, которую я считаю почти эквивалентной, за исключением того, что goroutine - это зеленый поток, а не процесс.

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    for {
        time.Sleep(time.Second)
        fmt.Println("Put")
        ch <- 1
    }
}

Когда я набираю go run csp.go, он печатает только один «Put», и среда выполнения Go подсказывает, что программа находится в тупике.

Почему multiprocessing.Queue.put() не блокирует?

1 Ответ

0 голосов
/ 22 декабря 2018

Укажите длину очереди, равную 1, и она будет блокироваться при необходимости

   Python 2.7.12 (default, Nov 12 2018, 14:36:49) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import multiprocessing
    >>> import select
    >>> import time
    >>> 
    >>> q = multiprocessing.Queue(maxsize=1)
    >>> q.put(9)
    >>> q.put(10)  // blocking here, have to ctrl-c to escape
    ^CTraceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/multiprocessing/queues.py", line 101, in put
        if not self._sem.acquire(block, timeout):
    KeyboardInterrupt
    >>> 
...