簡體   English   中英

如何控制有條件的並行進程

[英]How to control parallel processes with condition

我想控制我的進程,而我沒有找到工作 url。

但是我有NameError: name 'status' is not defined由於線程沒有等待聲明一個變量

import requests
from multiprocessing import Process


def first_function(i):
    global status
    status = False
    try:
        response = requests.get(f'https://ru.hexlet.io/{i}')
        if response.status_code == 200:
            status = True
    except Exception as e:
        print(str(e))


def second_function():
    for i in [1,2,3,4,5,6,'courses',8,9,10]:
        Process(target=first_function, args=(i, )).start()
        print(i)
        if status:
            print('working', i)
            break


if __name__ == '__main__':
    second_function()

我建議使用multiprocessing.pool.Pool來限制同時運行的進程數(因為您已經指出它們可能非常多)。

如果你使用它的apply_async()方法向它“提交”任務,你可以使用可選的callback參數來指定一個 function,只要其中一個子進程完成,就會調用它。 這提供了一種方法來終止提交到pool的其他進程的進一步處理。

import multiprocessing as mp
import requests


def worker(i):
    try:
        response = requests.get(f'https://ru.hexlet.io/{i}')
        if response.status_code == 200:
            return i
    except Exception as exc:
        print(f'{i!r} caused {exc}')
    return None


if __name__ == '__main__':

    def notify(i):
        """Called when a Pool worker process finishes execution."""
        if i is not None:
            print(f'{i!r} worked')
            pool.terminate()  # Stops worker processes immediately.

    pool = mp.Pool()

    for i in [1,2,3,4,5,6,'courses',8,9,10]:
        pool.apply_async(worker, (i,), callback=notify)

    pool.close()
    pool.join()
    print('fini')

Output:

'courses' worked
fini

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM