首页 > 编程语言 >python多线程中一种错误的写法

python多线程中一种错误的写法

时间:2023-11-22 16:46:54浏览次数:36  
标签:__ function python results process result 多线程 写法 pool

直接先上错误代码:

import multiprocessing

def first_way():
    init = 3
    def process_function(item):
        result = item * init
        return result

    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    pool = multiprocessing.Pool(processes=4)

    # 创建一个列表来存储每个进程的结果
    results = []

    for i in data:
        result = pool.apply_async(process_function, (i,))
        results.append(result)

    pool.close()
    pool.join()

    # 打印结果
    for result in results:
        print(result.get())  # 使用get()方法获取进程的结果

if __name__ == "__main__":
    first_way()

这个代码的问题是:

multiprocessing.Pool 使用 pickle 来序列化和反序列化函数和参数,以便在多个进程之间传递。在这个错误代码中,process_function 函数被定义在 first_way 函数内部,这可能导致 pickle 出现问题,因为它无法序列化局部函数。

要解决这个问题,可以将 process_function 移出 first_way 函数,使其成为一个全局函数。下面是修复后的代码:

import multiprocessing

# 将 process_function 移出 first_way 函数,定义为一个全局函数
def process_function(item):
    init = 3
    result = item * init
    return result

def first_way():
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    pool = multiprocessing.Pool(processes=4)

    # 创建一个列表来存储每个进程的结果
    results = []

    for i in data:
        result = pool.apply_async(process_function, (i,))
        results.append(result)

    pool.close()
    pool.join()

    # 打印结果
    for result in results:
        print(result.get())  # 使用get()方法获取进程的结果

if __name__ == "__main__":
    first_way()

通过将 process_function 定义为全局函数,可以避免 pickle 出现问题

如果返回多个结果:

import multiprocessing

def process_function(item):
    result1 = item * 2
    result2 = item ** 2
    return result1, result2

def main():
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    pool = multiprocessing.Pool(processes=4)

    # 创建一个列表来存储每个进程的结果
    results = []

    for i in data:
        result = pool.apply_async(process_function, (i,))
        results.append(result)

    pool.close()
    pool.join()

    # 打印结果
    for result in results:
        result1, result2 = result.get()
        print(f"Result 1: {result1}, Result 2: {result2}")
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
if __name__ == "__main__":
    main()

标签:__,function,python,results,process,result,多线程,写法,pool
From: https://www.cnblogs.com/xxpythonxx/p/17849664.html

相关文章

  • Python基础知识
    一、先置知识1、标识符标识符由字母、数字、下划线组成。所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。标识符是区分大小写的。以下划线开头的标识符是有特殊意义的。以单下划线开头_foo的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用**fr......
  • 如何在Python中向一个集合添加值
    用Set.add()函数向一个集合只添加一个值从数学上讲,集合是一个在逻辑上有联系的不同对象的集合。在Python中,集合是一个内置的数据类型,它是无索引的和不可变的。这意味着我们可以通过一些特定的索引来访问集合项,而且我们不能修改集合内的现有数据。我们可以通过在Python中创建一个......
  • 使用Python协程并发测试cdn响应速度
    代码干净清爽才能看着赏心悦目:#!/usr/bin/envpython3.11importtimefromcontextlibimportcontextmanagerfromenumimportStrEnumimportanyioimporthttpx@contextmanagerdeftimeit(msg:str):start=time.time()yieldcost=time.time()-sta......
  • python wordcloud生成词云
    #!/usr/bin/envpython#coding:utf-8#pipinstallwordcloud#pipinstallmatplotlibimportwordcloudimportmatplotlib.pyplotaspltimportnumpyasnpfromPILimportImagetext="""给你一瓶魔法药水喝下去就不需要氧气给你一瓶魔法药水喝下去就不怕身体......
  • Python全局解释器锁GIL机制
    全局解释器锁GlobalInterpreterLock,CPython在解释器级别的一把锁,叫GIL全局解释器锁。程序编译成字节码,程序想跑多线程,但是GIL保证CPython进程中,同一时刻只能有一个线程执行字节码。所以,哪怕是在多CPU的情况下,即使每个线程恰好调度到了每个CPU上,有了这把大锁,同时只能有一个CPU......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-32-JavaScript的调用执行-下篇
    1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚操作过程和步骤我们需要跟踪鼠标点击了哪些元素需要标记出来。虽然很少遇到,但是为了以后大家可以参考或者提供一种思路,今天宏哥就在这里把这种测试场景playwright是如何处理的讲解和分享一下。2.用法......
  • [951] Understanding the pattern of "(.*?)" in Python's re package
    InPython'sregularexpressions, (.*?)isacapturinggroupwithanon-greedyquantifier. Let'sbreakdownthecomponents:(and ):Parenthesesareusedtocreateacapturinggroup.Thisallowsustocaptureaportionofthematchedtext..*?:......
  • [950] Python RegEx (re library)
    ref:PythonRegExARegEx,orRegularExpression,isasequenceofcharactersthatformsasearchpattern.RegExcanbeusedtocheckifastringcontainsthespecifiedsearchpattern.RegExModulePythonhasabuilt-inpackagecalled re,whichcanbeu......
  • 19.python 创建一个本地web服务器
    编写一个server.py文件1importhttp.server2importsocketserver34PORT=800056Handler=http.server.SimpleHTTPRequestHandler78withsocketserver.TCPServer(("",PORT),Handler)ashttpd:9print("Serverstartedatlocalhos......
  • 聪明办法学python
    数据类型:整数(int)         浮点数(float)         布尔值(bool):truefalse         类型(type):print(type(2)) print(type(2.2))  print(type(2<2.2))         isinstance(a,int)常数:truefalsenone......