在多处理池中导入和操作对象的正确方法?

2024-04-25 19:44:34 发布

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

我有一个非常简单的多处理脚本,我无法开始工作

我需要它做的是:

  • 处理并遍历项目列表
  • 为处理的每个项目运行计数器
  • 根据计数器打印msg_列表中的项目

这些过程相互冲突。我尝试了很多方法,比如使用lock(),并通过map传递所有信息,但都无法正常工作

这是密码

from multiprocessing import Pool, Lock

counter = 0
msg_list = ["message1", "message2", "message3", "message4", "message5", "message6", "message7", "message8", "message9", "message10", "message11", "message12"]


def increment(item):

    global counter
    global msg_list

    print(counter, item, msg_list[counter])
    counter = counter + 1


if __name__ == '__main__':

    item_list = ["item1",
                 "item2",
                 "item3",
                 "item4",
                 "item5",
                 "item6",
                 "item7",
                 "item8",
                 "item9",
                 "item10",
                 "item11",
                 "item12"]

    p = Pool(4)
    p.map(increment, item_list)
    p.terminate()

输出的外观:

0 item1 message1
1 item2 message2
2 item3 message3
3 item4 message4
4 item5 message5
5 item6 message6
6 item7 message7
7 item8 message8
8 item9 message9
9 item10 message10
10 item11 message11
11 item12 message12

输出当前的外观

0 item1 message1
1 item2 message2
2 item3 message3
3 item4 message4
4 item6 message5
0 item5 message1
5 item7 message6
1 item8 message2
6 item9 message7
7 item10 message8
2 item11 message3
8 item12 message9

Tags: 项目countermsgitemlistitem1message4message1
1条回答
网友
1楼 · 发布于 2024-04-25 19:44:34

在windows上,除非设置共享内存,否则进程不会共享任何进程空间。而共享内存对于python来说很难使用,因为任何共享数据仍然需要包装在python对象中

创建池时,工作进程启动一个新的python实例,然后父进程的状态被pickle、发送给工作进程并取消pickle。这可能是一个昂贵的操作。目标通常是保持进程间通信与正在完成的cpu工作相比较低

从你的笔记中,我认为msg_list实际上是从网页上刮下来的东西。这很好!以下是将刮削推进工作流程的一般概述:

import multiprocessing as mp

if __name__ == "__main__":
    # imports not needed in worker
    import pandas as pd

def worker(url):
    import requests
    try:
        data = requests.get(url)
        interesting = do_your_scraping()
        return = format_for_pandas(interesting)
    except AnyExceptionsYouShouldCatch:
        return default_payload # whatever you want an error
                               # to look like
def main():
    import pandas
    with open("file_with_urls.txt") as urls_file:
        urls = [line.strip() for line in urls_file]
    with mp.Pool(4) as pool:
        df = pd.DataFrame(pool.map(worker, urls, chunksize=1)
<>因为大部分时间都在等待远程Web服务器响应,如果您真的需要在工人之间进行通信,那么可以考虑线程池。一次只能运行一个线程,但是如果大多数线程在等待远程时被阻塞,那么它仍然可以正常运行

还考虑有Web刮削工具,如^ {CD2>}。你会发现它适合你的需要

相关问题 更多 >

    热门问题