Pyosmium File Reader не работает в многопроцессорной - PullRequest
0 голосов
/ 14 апреля 2019

Я сделал программу чтения файлов OSM с PyOsmium, и оказалось, что если вы запустите анализатор файлов в основном процессе (osm.SimpleHandler.apply_file), а затем запустите еще один в потоке, он остановится, и процесс останется в память.

Вот код, и вы можете раскомментировать первую строку, читая nc.apply_file(input_file), и посмотреть результат.

Попробуйте комментировать и раскомментировать эти вызовы apply_file и посмотреть результат. По-видимому, если он вызывается в основном процессе, любой другой apply_file зависнет.

Я сделал обходной путь, поместил apply_file в тот же процесс. Но в чем причина проблемы и доступны ли исправления?

import sys
from multiprocessing import Queue, Process
import osmium as osm

input_file = sys.argv[1] # give it an .osm.pbf file
readq = Queue()

class WayCounter(osm.SimpleHandler):
    ways_count = 0
    def way(self, w):
        self.ways_count += 1

nc = WayCounter()
# ========= running this line blocks the reader process =================
#nc.apply_file(input_file)

def reader():
    nc.apply_file(input_file) # works if here
    print(f'counted ways: {nc.ways_count}')
    class FootPathFinder(osm.SimpleHandler):
        def way(self, w):
            if 'highway' not in w.tags and w.tags.get('railway') != 'platform':
                return
            print('working')

            tags = {t.k: t.v for t in list(w.tags)}
            try:
                coords = [(n.lon, n.lat) for n in w.nodes]
            except osm.InvalidLocationError:
                return

            refs = [i.ref for i in w.nodes]
            readq.put((tags, coords, refs))

    pf = FootPathFinder()
    pf.apply_file(input_file, locations=True)
    readq.put(None)

reader_proc = Process(target=reader)
reader_proc.start()

while True:
    data = readq.get()
    if data is None:
        break

reader_proc.join()
...