精华内容
下载资源
问答
  • libuv异步文件读写

    2018-01-30 15:02:22
    libuv 异步文件读写 一、libuv编译环境  1.可查看另一篇“libuv 介绍与编译”- http://mp.blog.csdn.net/postedit/79193274 程序代码 #include #include #include #include ...

    libuv 异步文件读写

    一、libuv编译环境

     1.可查看另一篇“libuv 介绍与编译”-  http://mp.blog.csdn.net/postedit/79193274


    程序代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #include "fcntl.h"
    #include "uv.h"

    static uv_loop_t* event_loop = NULL;
    static uv_fs_t req;
    static uv_fs_t write_req;
    static uv_file fs_handle;

    char mem_buffer[1024];

    /*
    uv_fs_t
    result:每次请求的结果都是返回这个值;
    打开文件:result返回打开文件句柄对象uv_file;
    读文件:  result返回读到的数据长度;
    写文件:  result返回写入的数据长度;
    */
    static void uv_fs_read_cb(uv_fs_t* req)
    {
     //打印读到的字节数
     printf("read %d byte\n", req->result);
     mem_buffer[req->result] = 0; //字符串结尾符;
     //打印数据
     printf("buffer:%s\n",mem_buffer);

     uv_fs_close(event_loop, req, fs_handle, NULL);
     uv_fs_req_cleanup(req);
    }

    static void uv_fs_open_cb(uv_fs_t* req)
    {
     fs_handle = req->result;
     uv_fs_req_cleanup(req);
     printf("open success!\n");

     //读文件
     uv_buf_t buf = uv_buf_init(mem_buffer, 1024);
     uv_fs_read(event_loop, req, fs_handle, &buf, 1, 0, uv_fs_read_cb);
    }

    int main(int argc, char** argv)
    {
     event_loop = uv_default_loop();
     //请求打开文件;
     uv_fs_open(event_loop, &req, "test.txt",0, _O_RDONLY, uv_fs_open_cb);

     //请求写文件
     uv_buf_t write_buf = uv_buf_init("helloworld!!!\n", 14);
     uv_fs_write(event_loop, &write_req, (uv_file)1, &write_buf, 1, 0, NULL);
     //释放请求req所占的资源;
     //如果请求函数不需要回调函数则下面可直接cleanup,否则把cleanup放到回调函数中执行;
     uv_fs_req_cleanup(&write_req);

     uv_run(event_loop, UV_RUN_DEFAULT);

     system("pause");

     return 0;

    }

    展开全文
  • C#异步文件读写访问

    2020-10-15 22:25:29
    可使用异步功能访问文件。通过使用异步功能,你可以调用异步方法而无需使用回调,也不需要跨多个方法或 lambda 表达式来拆分代码。若要使同步代码异步,只需调用异步方法而非同步方法,并向代码中添加几个关键字。 ...

    可使用异步功能访问文件。 通过使用异步功能,你可以调用异步方法而无需使用回调,也不需要跨多个方法或 lambda 表达式来拆分代码。 若要使同步代码异步,只需调用异步方法而非同步方法,并向代码中添加几个关键字。

    可能出于以下原因向文件访问调用中添加异步:

    • 异步使 UI 应用程序响应速度更快,因为启动该操作的 UI 线程可以执行其他操作。 如果 UI 线程必须执行耗时较长的代码(例如超过 50 毫秒),UI 可能会冻结,直到 I/O 完成,此时 UI 线程可以再次处理键盘和鼠标输入及其他事件。
    • 异步可减少对线程的需要,进而提高 ASP.NET 和其他基于服务器的应用程序的可伸缩性。 如果应用程序对每次响应都使用专用线程,同时处理 1000 个请求时,则需要 1000 个线程。 异步操作在等待期间通常不需要使用线程。 异步操作仅需在结束时短暂使用现有 I/O 完成线程。
    • 当前条件下,文件访问操作的延迟可能非常低,但以后可能大幅增加。 例如,文件可能会移动到覆盖全球的服务器。
    • 使用异步功能所增加的开销很小。
    • 异步任务可以轻松地并行运行。
    • 一般来说,异步的方法命名都是带有Async后缀的

    任何性能提升都几乎完全来自并行处理而不是异步处理。 异步的优点在于它不会占用多个线程,也不会占用用户界
    面线程。

    新建.net core 3.1 控制台应用程序AsyncFileAccessDemo。

    注意,在.net framework 4.6尚未存在函数(System.IO.File.AppendAllTextAsync),需使用.net core

    一、编写相应的测试程序:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;

    namespace AsyncFileAccessDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("准备异步写入文件...");
                string path = "F:\\a.txt";
                List<Task> tasks = new List<Task>();
                for (int i = 0; i < 5; i++)
                {
                    Task task = AppendFileAsync(path, Path.GetRandomFileName());
                    tasks.Add(task);
                }
                Task.WaitAll(tasks.ToArray());
                Console.WriteLine("这里已经写入文件执行完毕...");
                Task<string> taskRead = ReadFileAsync(path);
                Console.WriteLine($"读取的内容:{taskRead.Result}");
                Task.WhenAll(taskRead).ContinueWith(p => Console.WriteLine("这里可以执行其他回调操作...."));
                Console.WriteLine("阻塞任务已完成,启动其他...");
                Console.ReadLine();
            }

            /// <summary>
            /// 向一个文件中追加内容
            /// </summary>
            /// <param name="path"></param>
            /// <param name="message"></param>
            /// <returns></returns>
            static async Task AppendFileAsync(string path, string message) 
            {
                await File.AppendAllTextAsync(path, $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}->{message}\r\n", Encoding.Default);
            }

            /// <summary>
            /// 读取文件的所有内容
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            static async Task<string> ReadFileAsync(string path) 
            {
                string content = await File.ReadAllTextAsync(path, Encoding.Default);
                return content;
            }
        }
    }

     

    二、程序运行如图:

    展开全文
  • libuv_异步文件读写

    2018-04-27 06:21:55
    异步文件操作 1: uv_fs_t: 文件操作的请求对象; result是每次请求的结果; 2: uv_fs_open: 打开一个文件: 文件的打开模式 #include &lt;fcntl.h&gt;,以linux的模式为准; 打开文件成功后: 获得打开...

    架构图、事件循环loop

    这里写图片描述

    这里写图片描述


    异步文件操作

    这里写图片描述

    1: uv_fs_t: 文件操作的请求对象;  
         result是每次请求的结果;
    2: uv_fs_open: 打开一个文件:
         文件的打开模式 #include <fcntl.h>,以linux的模式为准;
    
        打开文件成功后: 获得打开文件的句柄uv_file对象 result
    3: uv_fs_req_cleanup: 清理这个请求所占的资源
    4: uv_fs_close: 关闭掉一个文件
    5: uv_fs_read: 异步的读文件
    6: uv_fs_write: 异步写文件

    这里写图片描述

    配置好存放文件的目录
    例如我的文件在bin文件夹

    这里写图片描述

    这里写图片描述

    打开与关闭文件

    这里写图片描述
    这里写图片描述

    异步读取文件
    这里写图片描述

    这里写图片描述


    stdin/stdout

    1: 学会标准输出的异步读写;
    stdin –> 0
    stdout–>1;

    2:如果要回掉:那么就回掉函数里面清理请求,否则的话,调完以后马上清理;

    异步写文件
    这里写图片描述

    这里写图片描述


    code

    展开全文
  • Asp.net异步文件读写并发处理总结

    千次阅读 2013-06-21 14:10:51
    Asp.net异步文件读写并发处理总结 运行场景 系统在用户打开下载页面的时候异步请求,根据数据动态生成一个Word文件,并返回给页面文件的大小显示在页面上,用户在生成后可以点击下载获取生成的Word文件,不希望数据...

    Asp.net异步文件读写并发处理总结

    运行场景

    系统在用户打开下载页面的时候异步请求,根据数据动态生成一个Word文件,并返回给页面文件的大小显示在页面上,用户在生成后可以点击下载获取生成的Word文件,不希望数据有超过5分钟的延迟。

    遇到的问题

    一开始很简单的写了几句代码,在本地测试通过。省去业务逻辑的代码如下

    生成Word:

    protected int CreateWord()

    {

    string strFilePath = @"D:\NewWord.docx";

     ProjectWord word = new ProjectWord();

    word.Save(strFilePath);

    System.IO.FileInfo file = new System.IO.FileInfo(strFilePath);

    return file.Length;

    }

    下载Word:

    Response.ContentType = "application/x-zip-compressed";

    Response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(strFilePath));

    Response.TransmitFile(strFilePath);

    Response.Flush();

    Response.End();

     

    上传到服务器的时候,大量的操作就出问题了。在word.Save的时候出现了IO读写错误,想了想是文件被用户下载的时候,给占用的,读写不能同时操作,怎么办呢?

    方案一

    生成Word的代码:

    protected int CreateWord()

    {

    string strFilePath = @"D:\NewWord.docx";

     

    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(() =>

    {

    ProjectWord word = new ProjectWord();

    int i = 0;

    while (i < 10)

    {

    try

    {

    word.Save(strFilePath);

    }

    catch

    {

    System.Threading.Thread.Sleep(1000);

    i++;

    }

    }

    }));

    t.Start();

    System.IO.FileInfo file = new System.IO.FileInfo(strFilePath);

    return file.Length;

    }

    下载Word代码不变。

    网站不在报错了,用户也能正常下载了文件,但下载出来的文件有时候不是及时的,原因太简单了,保存10次都没成功的话,就不保存了,而且并发量大的时候是几乎不会成功的。只适合小并发量的情况下使用该方法,小并发量我也不推荐,虽然我使用了这个方法顶了几个小时。

    方案二:

    生成Word的代码:

    protected int CreateWord()

    {

    string strFilePath = @"D:\NewWord.docx";

    lock (brCreaterAddressLock)

    {

    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(() =>

    {

    brCreaterAddressLock.AddParticipant();

    ProjectWord word = new ProjectWord();

    int i = 0;

    while (i <= 10)

    {

    try

    {

    word.Save(strFilePath); }

    catch

    {

    }

    finally

    {

    brCreaterAddressLock.RemoveParticipant();

    }

    }

    }));

    t.Start();

    }

    System.IO.FileInfo file = new System.IO.FileInfo(strFilePath);

    return file.Length;

    }

    public static System.Threading.Barrier brCreaterAddressLock = new System.Threading.Barrier(0);

     

    下载Word的代码:

    Handler.brCreaterAddressLock.AddParticipant();

    Handler.brCreaterAddressLock.SignalAndWait();

    Response.ContentType = "application/x-zip-compressed";

    Response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(strFilePath));

    Response.TransmitFile(strFilePath);

    Response.Flush();

    Response.End();

    该方案运行良好,但下载的响应速度有点慢,在生成的时候,下载的线程需要等生成的线程结束后才能运行。这样对用户的来说不太好,虽然word的生成也只是几秒钟,而且是异步生成文件,页面上有个转圈圈的图片给用户看。

    方案三

    生成Word的代码:

    protected int CreateWord()

    {

    if (brCreaterAddressLock.ParticipantCount == 0)

    {

    lock (brCreaterAddressLock)

    {

    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(() =>

    {

    brCreaterAddressLock.AddParticipant();

    ProjectWord word = new ProjectWord();

    int i = 0;

    while (i <= 10)

    {

    try

    {

    word.Save(@"D:\NewWord.docx");

    }

    catch

    {

    }

    finally

    {

    brCreaterAddressLock.RemoveParticipant();

    isCreatingAddress = false;

    }

    }

    }));

    t.Start();

    }

    }

     

    System.IO.FileInfo file = new System.IO.FileInfo(strFilePath);

     

    return file.Length;

     

     

    }

    public static System.Threading.Barrier brCreaterAddressLock = new System.Threading.Barrier(0);

    下载Word的代码:

    Handler.brCreaterAddressLock.AddParticipant();

    Handler.brCreaterAddressLock.SignalAndWait();

    Handler.brCreaterAddressLock.RemoveParticipant();//要注意这句,SignalAndWait()不会帮你移除一个参与者,如果没这句的话,在生成的时候 if (brCreaterAddressLock.ParticipantCount == 0)这句就只会运行一次

    Response.ContentType = "application/x-zip-compressed";

    Response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(strFilePath));

    Response.TransmitFile(strFilePath);

    Response.Flush();

    Response.End();

    这样的话,用户在文件生成中的时候就会给他直接旧版文件的大小,加快了异步的响应速度,提高了用户体验。


    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
    展开全文
  • python 如果要使用协程写异步程序,尽量别调用阻塞式API 遗憾的是python内置的文件操作和requests库的API都是阻塞式的 我写了一个真正的异步爬虫 网络部分使用第三方库 aiohttp 文件操作部分是是我自己想的,实现...
  • IO同步和异步读写文件、StringIO和BytesIO
  • 在Win32系统下文件可以支持平常的同步读写异步读写(但在Win9X下,Win32系统不支持磁盘文件异步读写)。本节在后面部分将会介绍文件异步读写,最后一段内容将向大家讲解一下文件的区域加锁。 在Win32系统中...
  • 文件同步与异步读写

    2012-05-25 10:58:27
    里面包含两个文件,一个是从网上找到的vc6.0下读文件程序,另外一个是自己编写的VS2005下写文件程序,都包含了同步和异步方式。在VS2005下运行通过。
  • 异步读写文件

    千次阅读 2012-09-28 16:54:12
    // 文件关联的句柄。 if (pMyOverlapped->m_io == FileIo::FI_READ) // 读取完毕,要写。 { //开始异步写 HANDLE hWrite = pHandle->hWrite; pMyOverlapped->m_readPos += dwTransferred; ...
  • 5.2 磁盘文件的正常读写异步读写 在Win32系统下文件可以支持平常的同步读写异步读写(但在Win9X下,Win32系统不支持磁盘文件异步读写)。本节在后面部分将会介绍文件异步读写,最后一段内容将向大家讲解...
  • 文件异步操作,包括异步写入,异步读取,文件删除
  • c/c++ 文件异步读写

    千次阅读 2018-02-18 16:43:14
    文件异步读写 1: 普通的读写文件打开文件都是同步的,比如C的fopen, fclose, fread等; 2: 磁盘的访问速度远远的低于内存,所以OS要等待磁盘设备来读写。 3: 如果采用同步,那么任务将会挂机,等待磁盘读好数据好...
  • 同步与异步 在这先对同步和异步进行区别 同步:前面的代码先执行 ...在fs中对于文件的操作有异步和同步两种方式,异步中又分为普通异步和Promise异步两种 具体看代码 一. 读取文件 导入模块 let fs=require('fs')...
  • lua中实现异步资源读写

    千次阅读 2014-06-27 14:15:00
    lua中实现异步资源读写 同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除。如果使用os.execute执行 rm -rf ooxx 是非常快的但由于os.execute一旦报错,那整个lua进程就...
  • 异步读写

    千次阅读 2015-10-10 17:10:54
    1. 若要进行异步读写,创建(或打开)文件时需要指定异步标志位(FILE_FLAG_OVERLAPPED)。 2. 读写函数的返回值依赖底层实现,若底层直接完成操作,则函数返回成功,User Mode代码可立即操作缓冲区。若底层挂起...
  • C#.net 异步读写文件

    千次阅读 2007-04-26 16:46:00
    使用异步读写实现文件的Copy:using System;using System.IO;using System.Text;using System.Threading;using System.Runtime.InteropServices;using System.Runtime.Remoting.Messaging;public class ...
  • 在Win32系统下文件可以支持平常的同步读写异步读写(但在Win9X下,Win32系统不支持磁盘文件异步读写)。本节在后面部分将会介绍文件异步读写,最后一段内容将向大家讲解一下文件的区域加锁。 在Win32系统中...
  • 文件的读取与写入又分为同步和异步两种形式 同步和异步的区别 同步:阻塞,当前事情没有做完之前不能再去做其他的事情 var a = 10; var b = 20; for(var i=0;i<10;i++){ console...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,186
精华内容 56,474
关键字:

异步文件读写