函数的Python池多处理

2024-04-25 05:36:25 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我一直在玩一些代码,一部分是为了更好地理解python,另一部分是为了从web上获取一些数据。如果使用Python多处理和池,我想了解的部分内容。在

我已经有了基本的工作,但是,因为我首先编写了单线程的过程,然后转移到使用池来多线程处理,所以我既有全局变量,又有对全局定义函数的调用。我猜这两种情况都不好,但在网上搜索,事情似乎变得非常复杂,很快就不能回答我的问题了。在

有谁能先确认全局变量是坏的,可能会导致问题,对我来说这是有意义的,因为两个线程可以同时访问同一个变量,因此会出现问题。在

其次,如果我有一个全局定义的函数,为了参数的缘故,使用标准字符串函数处理并返回一个字符串,是否可以在池进程中调用它?在


Tags: 数据函数字符串代码web内容参数定义
1条回答
网友
1楼 · 发布于 2024-04-25 05:36:25

当涉及到如何访问变量和函数时,多线程处理和多处理是完全不同的。单独的进程(多处理)有不同的内存空间,因此无法访问相同的(实例)函数或变量,因此全局变量的概念并不存在。进程之间的数据共享必须通过可以为您传递数据的管道或队列来完成。不过,主进程和子进程都可以访问同一队列,因此在某种程度上可以将其视为一种全局变量。在

有了多线程,你肯定可以访问全局变量,如果你的程序很简单,这是一个很好的编程方式。例如,子线程可以读取主线程中变量的值,并将其用作子线程函数中的标志。但是,您需要了解线程安全操作;就像您所说的,同一对象上的多个线程执行的复杂操作可能会导致冲突。在这种情况下,您需要使用线程锁定或其他安全方法。然而,许多操作自然是原子的,因此是线程安全的,例如读取单个变量。这里有一个很好的线程安全操作和线程同步列表on this page。在

一般来说,对于多处理和多线程处理,您会将一些耗时的函数传递给线程或进程,但它们不会重新运行该函数的同一实例。下面的示例显示了多个线程以原子方式访问全局变量的有效用例。然而,单独的进程将不能。在

import multiprocessing as mp
import threading
import time

work_flag = True

def worker_func():
    global work_flag
    while True:
        if work_flag:
            # do stuff
            time.sleep(1)
            print mp.current_process().name, 'working, work_flag =', work_flag
        else:
            time.sleep(0.1)

def main():
    global work_flag

    # processes can't access the same "instance" of work_flag!
    process = mp.Process(target = worker_func)
    process.daemon = True
    process.start()

    # threads can safely read global work_flag
    thread = threading.Thread(target = worker_func)
    thread.daemon = True
    thread.start()

    while True:
        time.sleep(3)
        # changing this flag will stop the thread, but not the process
        work_flag = False

if __name__ == '__main__':
    main()

相关问题 更多 >