c语言跨进程回调函数,14.python多进程之回调函数

一、 概述

需要回调函数的场景:进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了额,你可以处理我的结果了。主进程则调用一个函数去处理该结果,该函数即回调函数

我们可以把耗时间(阻塞)的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程在执行回调函数时就省去了I/O的过程,直接拿到的是任务的结果。

子进程执行返回的结果做为回调函数的参数传入。

回调函数是在主进程中执行的。回调函数适用于子进程数多且耗时时间长的场景。

二、 示例

使用多进程请求多个URL来减少网络等待浪费时间

from multiprocessing import Pool

import requests

import json

import os

def get_page(url):

print(' get %s' %(os.getpid(),url))

respone=requests.get(url)

if respone.status_code == 200:

return {'url':url,'text':respone.text}

def pasrse_page(res):

print(' parse %s' %(os.getpid(),res['url']))

parse_res='url: size:[%s]\n' %(res['url'],len(res['text']))

with open('db.txt','a') as f:

f.write(parse_res)

if __name__ == '__main__':

urls=[

'https://www.baidu.com',

'https://www.python.org',

'https://www.openstack.org',

'https://help.github.com/',

'http://www.sina.com.cn/'

]

p=Pool()

res_l=[]

for url in urls:

res=p.apply_async(get_page,args=(url,),callback=pasrse_page)

res_l.append(res)

p.close()

p.join()

'''

拿到的是get_page的结果,其实完全没必要拿该结果,该结果已经传给回调函数处理了

'''

print([res.get() for res in res_l])

'''

打印结果:

get https://www.baidu.com

get https://www.python.org

get https://www.openstack.org

get https://help.github.com/

parse https://www.baidu.com

get http://www.sina.com.cn/

parse https://www.python.org

parse https://help.github.com/

parse http://www.sina.com.cn/

parse https://www.openstack.org

[{'url': 'https://www.baidu.com', 'text': '\r\n...',...}]

'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//官方网站:www.feiyuol.com //郁金香灬老师 //QQ 150330575 //个人网站:www.yjxsoft.com 进程调用CALL 进程调用带多个的参数CALL // myInject_dll.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include"RWA.h" //PVOID 进程分配内存(WORD nSize ); //1、获取进程句柄 //2、读写 分配内存 创建线程 //3、进程分配内存 void mycall() { PVOID p1=进程分配内存(1000); printf("分配的内存地址=%p\n",p1); printf("按回车键 释放内存\n"); getchar(); 进程释放内存(p1,1000); printf("已经 释放内存\n"); } LPTHREAD_START_ROUTINE a; BOOL 进程调用CALL(PVOID pcall地址,PVOID plst参数 ); //LoadLibraryA(dll名字指针) //MessageBeep(1) void Test远程调用MessageBeep() { 进程调用CALL(MessageBeep,(PVOID)0x12768); } //注入my022MFC.dll到目标进程 void Test3() { char szDllName[]="my022MFC.dll"; //全路径 // char szDllName[]="C:\\Users\\yjxsoft\\Documents\\visual studio 2010\\Projects\\my022\\Debug\\my022MFC.dll"; PVOID p1=进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /*进程调用CALL(LoadLibraryA,(PVOID)szDllName);*/ 进程调用CALL(LoadLibraryA,(PVOID)p1); } void Test4() { // char szDllName[]="my022MFC.dll"; //全路径 char szDllName[]="E:\\1905\\代码\\my022-24\\Debug\\my022MFC.dll"; PVOID p1=进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /*进程调用CALL(LoadLibraryA,(PVOID)szDllName);*/ 进程调用CALL(LoadLibraryA,(PVOID)p1); } int _tmain(int argc, _TCHAR* argv[]) { //mycall(); Test3(); Test4(); return 0; } //作业 //1、练习进程注入DLL //2、进程分配的内存内存 使用完后 用VirtualFreeEx释放掉 //3、进程句柄使用完后用CloseHandle释放句柄资源
回调函数是一种在编程中常见的概念,尤其在C语言中经常使用。回调函数是指一个函数作为参数传递给另一个函数,并由另一个函数在合适的时间调用。 在C语言中,回调函数通常通过函数指针实现。具体步骤如下: 1. 首先定义一个函数指针类型,该函数指针类型与回调函数的参数和返回值类型相匹配。例如,如果回调函数接受一个整数参数并返回一个整数,则可以定义一个函数指针类型如下: ```c typedef int (*CallbackFunc)(int); ``` 2. 然后,在需要使用回调函数的地方,将回调函数作为参数传递给相应的函数。例如,假设有一个函数`doSomething`需要在某个时刻调用回调函数,可以这样定义`doSomething`: ```c void doSomething(int data, CallbackFunc callback) { // 执行一些操作 int result = callback(data); // 调用回调函数 // 处理回调函数的返回值 } ``` 3. 最后,实现一个回调函数,并将其传递给`doSomething`函数。回调函数的实现可以根据具体需求而定,只要其参数和返回值类型与回调函数指针类型匹配即可。 ```c int myCallback(int data) { // 处理回调函数的逻辑 return data * 2; // 返回处理后的结果 } ``` 然后可以通过如下方式调用`doSomething`函数,并传递回调函数作为参数: ```c int main() { int data = 5; doSomething(data, myCallback); // 将回调函数作为参数传递 // 继续其他操作 return 0; } ``` 这样,在`doSomething`函数内部,通过函数指针调用回调函数,从而实现了回调机制。回调函数可以在特定的时机被调用,以实现一些定制化的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值